【发布时间】:2017-04-24 19:05:09
【问题描述】:
为什么在mystring = "Hello, there!"; 行之后在这里调用析构函数
它还没有超出范围。我肯定错过了一些 C++ 的怪癖!
我知道那一行调用了默认的拷贝构造函数,析构函数总是在拷贝构造函数返回后调用吗?
顺便说一句,我使用的是 C++03,还没有 C++11。
编辑:另外请注意,我知道以下程序导致的双重删除。我在这里做实验。只是想引起您的注意。
class MyString
{
private:
char* mystring;
int m_length;
public:
MyString(const char* str="")
{
assert(str);
m_length = strlen(str) + 1;
mystring = new char[m_length];
for (int i = 0; i < m_length; ++i)
mystring[i] = str[i];
mystring[m_length-1] = '\0';
}
~MyString()
{
delete[] mystring;
}
};
int main()
{
MyString mystring("");
mystring = "Hello, there!";
cout << "Destructor not yet called ";
}
【问题讨论】:
-
您在运行调试器时得出了什么结论?
-
编译器生成隐式复制赋值运算符。您的对象是从编译器创建的临时对象中分配的(因为您有一个非显式的单参数构造函数(又名转换构造函数));它是那个被破坏的时间对象。其次,你的程序有问题
-
我肯定错过了 C++ 的一些怪癖! -- 不仅仅是你所缺少的“怪癖”。该程序产生双重删除错误
{MyString m1; MyString m2=m1;}, -
@svasa -- 阅读复制构造函数和赋值运算符。