【发布时间】:2020-01-24 05:40:35
【问题描述】:
这个愚蠢的代码剪断已经花了我 2 个小时,我不明白为什么第一个元素的析构函数,大小为 7 的那个,没有被调用?分配给new uint16_t[7] 的内存会怎样?
#include <iostream>
using namespace std;
struct Node
{
Node(uint16_t n) : p(new uint16_t[n]) {
cout<<"Constructed with size= "<<n<<", memory addr: "<<(p)<<endl;
for(uint16_t i=0; i<n; i++) p[i] = n;
}
~Node() {
cout<<"Destructor for p[0] = "<< *p <<" with memory addr: "<<p<<endl;
delete[] p;
}
uint16_t *p;
};
int main()
{
{
Node nd1(7);
{
nd1 = Node(3);
cout << "1st place holder" << endl;
}
cout << "2nd place holder" << endl;
}
return 0;
}
输出是
Constructed with size= 7, memory addr: 0x158cc20 Constructed with size= 3, memory addr: 0x158cc40 Destructor for p[0] = 3 with memory addr: 0x158cc40 1st place holder 2nd place holder Destructor for p[0] = 0 with memory addr: 0x158cc40 *** Error in `./a.out': double free or corruption (fasttop): 0x000000000158cc40 *** Aborted (core dumped)
【问题讨论】:
-
双重免费是因为你的班级违反了3/5/0的规则:https://stackoverflow.com/questions/4172722/what-is-the-rule-of-three
-
内置 operator=() 将对您的类进行成员明智的复制,最终复制指针的值。
-
@drescherjm 实际上,我期望的是,当我使用 = 运算符时,首先调用 Node(7) 的析构函数,然后进行赋值。但显然不是。
-
Node(7) 的析构函数未被 operator=() 调用
标签: c++ destructor