实例化并删除对象C++

Instantiate and Delete an object C++

本文关键字:C++ 对象 删除 实例化      更新时间:2023-10-16

我试图实例化一个对象,然后删除它,我做错了什么?

default:
        //Instantiate object of the ErrorHandler class
        errPtr = new ErrorHandler();
        //Print the error message to the console screen
        errPtr->showError("Invalid input, please select option 1 or 2, and press enter.");
        delete errPtr;
        errPtr->showError("hello"); //This line is being executed normally like object still exist.
        break;

我的问题是,为什么我可以调用showError();方法?

errPtr->showError("hello"); //This line is being executed normally like object still exist.

不过,这只是未定义的行为。

如果取消引用之前为deleted的指针,则可能发生任何事情,包括看似正确的行为。

实例化和删除的方式没有错——发生的事情取决于内存的分配方式(或者在这种情况下更合适的是释放)。

当您使用free()(c++中的delete)堆内存时,它只是将其标记为可用——它不会清除您的指针或它用来指向的内存;这样做会降低性能,尤其是在对象很大的情况下。在其他人使用它之前,所有东西都会原封不动地保存在内存中。

由于errPtr直接在delete之后使用,因此对象仍在内存中。

C++不会阻止你在删除指针后使用它,但这样做是一个非常糟糕的主意,因为你的指针现在指向可能被其他东西使用的内存。

基本上,你在这里做错的是在它所指向的内存被释放后使用指针。一旦你删除了你的对象,就要决定不引用它——你必须相信,一旦你调用了delete,内存现在是空闲的。