`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'“拥有”一个内存时,你才需要删除它。