即使内存不是动态分配的,在析构函数中是不是需要`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 是完全错误的(就像在您的示例中一样)。 您根本不应该使用newdelete 【参考方案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;`? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

cpp►动态内存分配与析构之复制构造函数/赋值运算符

类内的动态内存分配

析构函数为啥能释放对象内存?

如果debug调试的时候中断总是停在析构函数的delete[] p上

cpp中的析构函数会自动调用吗?即使析构函数没有提及非动态变量,它们是不是也会被删除?

为啥在析构函数中抛出异常时不调用重载删除?