这里有一个简单的问题,我的代码中有几个类,但只有其中一个表现出这个问题,我不能为我的生活找出原因.当我创建类的实例时,直接调用析构函数,但实际上该类的实例似乎没有被删除.
如果析构函数中没有影响类实例的delete []操作,也许我可以忍受.
我读到了关于“三个规则”或某事的某个地方,所以试图看看我错过了什么.我已经有一个默认构造函数和一个用户定义的构造函数.然后我添加了我认为称为复制构造函数的东西,如下所示:
MyClass::MyClass(const MyClass &duplicate)
{
variable1 = duplicate.variable1;
variable2 = duplicate.variable2;
// etc
}
我在这里错过了什么可能导致这个问题?
编辑:请求的代码.我已经将所有内容重命名,以便一目了然(此代码仍然可以解决问题).首先,头文件MyClass.h:
#ifndef MYCLASS_H
#define MYCLASS_H
#ifndef UNICODE
#define UNICODE
#endif
#include <string>
class MyClass
{
public:
MyClass();
MyClass::MyClass(const MyClass &);
MyClass(int, std::wstring inputWord, int);
~MyClass();
int intOne;
int intTwo;
};
#endif
下一个MyClass.cpp:
#include "MyClass.h"
#include <Windows.h>
MyClass::MyClass(const MyClass &duplicate)
{
intOne = duplicate.intOne;
intTwo = duplicate.intTwo;
}
MyClass::MyClass()
{
}
MyClass::~MyClass()
{
MessageBox(NULL, TEXT("TEST"), TEXT("TEST"),0);
}
MyClass::MyClass(int intOneInput, std::wstring stringInput, int intTwoInput)
{
intOne = intOneInput;
intTwo = intTwoInput;
}
最后我是如何创建我的对象的:
MyClass测试(0,TEXT(“TEST”),0);
[复制自op的评论]
实际上,抓住我的最后一条评论,解构函数不会被该特定行调用(直到它超出范围),执行的行是words.push_back(MyClass(0,TEXT(“TEST”),0));声明为std :: vector< MyClass>话
最佳答案 当对象被销毁时,应该调用析构函数.如果使用new创建对象,则在对象上调用delete时将调用析构函数.否则,当它超出其范围时应该调用它.您可以在其析构函数中设置断点,并查看callstack以检查调用析构函数的内容.希望能帮助到你.
[更新]
尝试为所有ctor和dtor添加以下printf,以确保您不会与临时创建的对象混淆.
printf("ctor %p\n", this); // in constructors
printf("dtor %p\n", this); // in destructor
[更新]
words.push_back(MyClass(0, TEXT("TEST"), 0));
这会创建一个临时对象,因为stl容器(如vector)总是“复制”要存储的东西. (除非发生“移动”.我不想在这里开始解释“移动”和右移.)