神奇的指针问题, 欢迎大侠指点

barrassed 2014-05-05 03:26:11
使用VS2005编译发布. 现遇到一个非常奇怪的问题, 大致代码如下:

bool A:Init ( point )
{
m_pPoint = point;

if( m_pPoint != point )
{
return false;
}

return true;
}


此段代码在Release编译下运行函数返回true, 正确的. 如果直接运行Release编译后的EXE, 则函数返回false. 有没有人遇到过这样的问题并解决? 请给点思路, 谢谢.
...全文
341 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztenv 版主 2014-05-05
  • 打赏
  • 举报
回复
找到就好了,
barrassed 2014-05-05
  • 打赏
  • 举报
回复
谢谢各位解答, 问题找到了.. 原因太低级了, 掩泪而过. 原因是指针未初始化, 在Release编译时有一个错误值, 而直接点击EXE时指针为NULL.
赵4老师 2014-05-05
  • 打赏
  • 举报
回复
有时不将“调用函数名字+各参数值,进入函数后各参数值,中间变量值,退出函数前准备返回的值,返回函数到调用处后函数名字+各参数值+返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的,包括捕获各种异常、写日志到屏幕、单步或设断点或生成core文件、……这些方法都不行! 写日志到文件参考下面:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
    #include <windows.h>
    #include <io.h>
#else
    #include <unistd.h>
    #include <sys/time.h>
    #include <pthread.h>
    #define  CRITICAL_SECTION   pthread_mutex_t
    #define  _vsnprintf         vsnprintf
#endif
//Log{
#define MAXLOGSIZE 20000000
#define MAXLINSIZE 16000
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef WIN32
void Lock(CRITICAL_SECTION *l) {
    EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
    LeaveCriticalSection(l);
}
#else
void Lock(CRITICAL_SECTION *l) {
    pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
    pthread_mutex_unlock(l);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
    struct tm *now;
    struct timeb tb;

    if (NULL==pszFmt||0==pszFmt[0]) return;
    _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
    ftime(&tb);
    now=localtime(&tb.time);
    sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
    sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );
    sprintf(mss,"%03d",tb.millitm);
    printf("%s %s.%s %s",datestr,timestr,mss,logstr);
    flog=fopen(logfilename1,"a");
    if (NULL!=flog) {
        fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
        if (ftell(flog)>MAXLOGSIZE) {
            fclose(flog);
            if (rename(logfilename1,logfilename2)) {
                remove(logfilename2);
                rename(logfilename1,logfilename2);
            }
        } else {
            fclose(flog);
        }
    }
}
void Log(const char *pszFmt,...) {
    va_list argp;

    Lock(&cs_log);
    va_start(argp,pszFmt);
    LogV(pszFmt,argp);
    va_end(argp);
    Unlock(&cs_log);
}
//Log}
int main(int argc,char * argv[]) {
    int i;
#ifdef WIN32
    InitializeCriticalSection(&cs_log);
#else
    pthread_mutex_init(&cs_log,NULL);
#endif
    for (i=0;i<10000;i++) {
        Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);
    }
#ifdef WIN32
    DeleteCriticalSection(&cs_log);
#else
    pthread_mutex_destroy(&cs_log);
#endif
    return 0;
}
//1-78行添加到你带main的.c或.cpp的那个文件的最前面
//81-85行添加到你的main函数开头
//89-93行添加到你的main函数结束前
//在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中
zilaishuichina 2014-05-05
  • 打赏
  • 举报
回复
引用 4 楼 zilaishuichina 的回复:
[quote=引用 楼主 barrassed 的回复:] 使用VS2005编译发布. 现遇到一个非常奇怪的问题, 大致代码如下: bool A:Init ( point ) { m_pPoint = point; if( m_pPoint != point ) { return false; } return true; } 此段代码在Release编译下运行函数返回true, 正确的. 如果直接运行Release编译后的EXE, 则函数返回false. 有没有人遇到过这样的问题并解决? 请给点思路, 谢谢.
目测应该是 多线程调用了这个函数 楼主可以在函数中打印一下
printf("id:%d\n", GetCurrentProcessId());
在多线程情况下 打印信息可能会混杂在一起 比如: iidd:1245[/quote] 错了 GetCurrentThreadId();
zilaishuichina 2014-05-05
  • 打赏
  • 举报
回复
引用 楼主 barrassed 的回复:
使用VS2005编译发布. 现遇到一个非常奇怪的问题, 大致代码如下: bool A:Init ( point ) { m_pPoint = point; if( m_pPoint != point ) { return false; } return true; } 此段代码在Release编译下运行函数返回true, 正确的. 如果直接运行Release编译后的EXE, 则函数返回false. 有没有人遇到过这样的问题并解决? 请给点思路, 谢谢.
目测应该是 多线程调用了这个函数 楼主可以在函数中打印一下
printf("id:%d\n", GetCurrentProcessId());
在多线程情况下 打印信息可能会混杂在一起 比如: iidd:1245
max_min_ 2014-05-05
  • 打赏
  • 举报
回复
不能吧!多线程这么短的时间 应该也不会出现了吧!
mujiok2003 2014-05-05
  • 打赏
  • 举报
回复
多线程的
图灵狗 2014-05-05
  • 打赏
  • 举报
回复
用日志文件随时记录m_pPoint和point的值,运行完之后找找有什么规律性的东西。
引用 楼主 barrassed 的回复:
使用VS2005编译发布. 现遇到一个非常奇怪的问题, 大致代码如下: bool A:Init ( point ) { m_pPoint = point; if( m_pPoint != point ) { return false; } return true; } 此段代码在Release编译下运行函数返回true, 正确的. 如果直接运行Release编译后的EXE, 则函数返回false. 有没有人遇到过这样的问题并解决? 请给点思路, 谢谢.
内容概要:本文详细介绍了MySQL中InnoDB存储引擎的逻辑存储结构及其表分区技术。InnoDB的逻辑存储单元由高到低依次为表空间、段、区、页和行,其中表空间包括系统表空间、独立表空间、通用表空间、Undo表空间和临时表空间,每种表空间具有不同的用途和管理方式。文章进一步讲解了表分区的概念与类型,包括RANGE、LIST、HASH、KEY以及多字段COLUMNS分区,阐述了分区的优势如提升查询性能、便于数据维护、支持跨物理设备存储等,并列举了实际SQL操作示例,帮助理解分区表的创建、修改、删除及重组等操作。同时指出了分区的限制条件,如最大分区数量、主键约束要求等。; 适合人群:具备一定MySQL数据库基础,从事数据库开发、运维或架构设计的技术人员,尤其是工作中涉及大数据量表管理与性能优化的1-3年经验研发人员。; 使用场景及目标:①深入理解InnoDB存储机制,优化数据库物理结构设计;②掌握表分区技术,应用于海量数据存储与高效查询场景,如日志系统、订单系统的时间分区设计;③通过分区实现数据归档、快速删除历史数据、提升查询性能等运维目标; 阅读建议:学习时应结合MySQL实际环境动手实践文中提供的SQL命令,重点关注表空间管理和分区策略的选择,理解其对性能和维护的影响,并注意分区使用中的限制条件以避免设计失误。
内容概要:本文系统介绍了GitHub Copilot的实战使用技巧,涵盖其核心功能、提示工程、上下文管理、自定义配置及常见误区。文章强调Copilot不仅是代码补全工具,更是覆盖软件开发全生命周期的AI编程助手,重点讲解如何通过上下文工程、提示词结构化、斜杠命令与聊天参与者等方式提升代码生成质量,并结合实战案例展示在测试生成、代码重构、调试、文档编写等场景中的高效应用。同时指出Copilot的局限性,倡导“人为主导、AI辅助”的协作模式,强调代码审查与安全合规的重要性。; 适合人群:具备一定编程经验,希望提升开发效率的个人开发者、团队工程师及技术管理者,尤其是正在使用或计划引入AI编程工具的研发人员。; 使用场景及目标:①掌握Copilot在测试生成、代码解释、重构优化、调试排错等方面的高级用法;②学会构建高质量提示词与自定义指令,使AI输出更贴合项目规范;③规避常见使用陷阱,实现安全、可控、高效的AI辅助开发。; 阅读建议:此文档兼具理论指导与实操示范,建议结合实际开发环境边学边练,重点关注提示工程、上下文管理与自定义指令配置,持续迭代优化使用方式,并在团队中建立统一的AI编码规范与审查机制。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧