`delete ptr;` 在析构函数中是否必要,即使内存不是动态分配的?
Is `delete ptr;` necessary in destructor even when memory is not dynamically allocated?
我创建了以下 class :
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
运算符。
举个例子:
int main() {
int a = 20;
int* ptr = &a;
delete ptr;
return 0;
}
如果你编译这段代码,它会令人惊讶地 (??) 编译而没有警告。
但是,调试器在调用 delete 运算符时破坏了代码。
delete_scalar.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;
}
'ptr' 没有指向分配的内存,所以不,你不想删除它。只有当'ptr'“拥有”一个内存时,你才需要删除它。
我创建了以下 class :
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
运算符。
举个例子:
int main() {
int a = 20;
int* ptr = &a;
delete ptr;
return 0;
}
如果你编译这段代码,它会令人惊讶地 (??) 编译而没有警告。
但是,调试器在调用 delete 运算符时破坏了代码。
delete_scalar.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;
}
'ptr' 没有指向分配的内存,所以不,你不想删除它。只有当'ptr'“拥有”一个内存时,你才需要删除它。