即使内存不是动态分配的,在析构函数中是不是需要`delete ptr;`? [复制]
Posted
技术标签:
【中文标题】即使内存不是动态分配的,在析构函数中是不是需要`delete ptr;`? [复制]【英文标题】:Is `delete ptr;` necessary in destructor even when memory is not dynamically allocated? [duplicate]即使内存不是动态分配的,在析构函数中是否需要`delete ptr;`? [复制] 【发布时间】:2020-11-10 15:11:34 【问题描述】:我创建了以下类:
class Deep
private :
int *ptr;
string name;
int age;
double marks;
public :
Deep() : ptr &age, name "Mandeep", age 20, marks 85.3
cout<<"Deep Constructor Called for : "<<name<<endl;
~Deep()
delete ptr;
cout<<"Destructor Called for : "<<name<<endl;
void get_data()
cout<<"Name : "<<name<<endl;
cout<<"Age : "<<*ptr<<endl;
cout<<"Marks : "<<marks<<endl;
;
int main()
Deep A;
A.get_data();
cout<<endl<<endl;
return 0;
在 Debugger 中运行程序时,程序在 delete ptr;
处崩溃。
delete ptr;
这里没有必要因为我没有动态分配任何内存给 *ptr
吗?
*ptr
是否已被析构函数删除,然后我在导致崩溃后尝试删除 *ptr
?
【问题讨论】:
delete
必须匹配 new
。您的代码中没有 new
,因此您不能使用有效的 delete
。
这与 必要性 无关——在不是通过 new
分配的对象上调用 delete
是完全错误的(就像在您的示例中一样)。
您根本不应该使用new
或delete
【参考方案1】:
delete
运算符只能在分配有new
的对象上调用。如果还没有分配new
内存,则不能调用delete
操作符。
举个例子:
int main()
int a = 20;
int* ptr = &a;
delete ptr;
return 0;
如果你编译这段代码,它出乎意料地(??)编译没有警告。
但是,调试器会在调用 delete 运算符时中断代码。 删除标量.cpp:
_CRT_SECURITYCRITICAL_ATTRIBUTE
void __CRTDECL operator delete(void* const block) noexcept
#ifdef _DEBUG
_free_dbg(block, _UNKNOWN_BLOCK);
#else
free(block);
#endif
但是,以下代码可以正常工作,因为内存已分配new
:
int main()
int* ptr = new int[5];
delete[] ptr;
return 0;
【讨论】:
所以析构函数会自动销毁指针和其他数据成员? @LykanMD 指针只是一个地址,即一个数字,没有什么可以破坏的。不要混合破坏指针和它指向的对象。如果您将指针设置为指向某个现有对象,则不应该做任何事情来破坏指针本身。 @LykanMD 这种混乱似乎是大多数新手指针问题的根源。指针和它指向的东西是两个不同的东西。【参考方案2】:‘ptr’没有指向分配的内存,所以不,你不想删除它。只有当‘ptr’“拥有”你需要删除的内存时。
【讨论】:
以上是关于即使内存不是动态分配的,在析构函数中是不是需要`delete ptr;`? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如果debug调试的时候中断总是停在析构函数的delete[] p上