You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++类中出现不同this指针的异常问题问询

聊聊你调试pint类遇到的奇怪现象

先把你贴的测试代码整理成清晰的格式:

#include <iostream> 
#include <Windows.h> 

class pint { 
public: 
    pint() { std::cout << "ctor >> " << this << std::endl; }; 
    ~pint() { std::cout << "dtor >> " << this << std::endl; }; 
    pint(int x) { std::cout << "set 1. >> " << this << std::endl; }; 
    pint& operator = (const pint& a) { 
        std::cout << "set 2. >> " << this << " | a >..." 
        // 看你代码截断了,应该是没写完赋值逻辑
    }; 
};

从你贴的代码和描述来看,应该是追踪对象构造、析构、赋值时,发现输出和预期不符对吧?比如突然多了构造/析构调用,或者赋值没按预想触发?我帮你梳理几个最可能的原因:

  • 临时对象在搞鬼:比如你写pint a; a = 10;这种代码时,编译器会先调用pint(int x)创建一个临时对象,再调用赋值运算符把临时对象的值赋给a,最后临时对象会被销毁。这时候你会看到先出"set 1.",再出"set 2.",最后多一条"dtor"——要是没意识到临时对象的存在,肯定会觉得奇怪。
  • 默认拷贝构造函数没日志:你没显式写拷贝构造函数,编译器会偷偷给你生成一个,但这个默认版本不会输出任何日志。比如你用pint b = a;或者函数传值返回pint对象时,都会触发这个默认拷贝构造,你看不到对应的日志,就会误以为对象凭空出现了。
  • Debug模式的额外操作:Windows下用VC++的Debug模式编译时,编译器会加一些内存检测的逻辑,可能会额外创建/销毁对象,导致输出的地址或者调用次数和Release模式不一样,这也是容易让人困惑的点。

给你几个实用的调试建议:

  1. 把赋值运算符的代码补全,记得把a的地址也完整输出,比如改成std::cout << "set 2. >> " << this << " | a > " << &a << std::endl;,这样能清楚看到赋值的源对象地址。
  2. 手动加个拷贝构造函数,比如:
    pint(const pint& other) {
        std::cout << "copy ctor >> " << this << " | from > " << &other << std::endl;
    }
    
    这样所有的拷贝行为都能被追踪到,不会漏掉编译器默认做的操作。
  3. 仔细检查你的测试代码,看看有没有像隐式类型转换、传值参数这种容易产生临时对象或拷贝的场景。

内容的提问来源于stack exchange,提问作者uzivanky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:24:12