实例化和删除对象C ++

时间:2016-04-03 21:17:01

标签: c++

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

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();删除它后的方法?

2 个答案:

答案 0 :(得分:4)

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

但它只是未定义的行为。

如果您要取消引用之前为delete d的指针,包括看似正确的行为,则会发生任何事情。

答案 1 :(得分:3)

实例化和删除的方式没有任何问题 - 发生的事情取决于内存的分配方式(或者在这种情况下更适合 deallocated )。

当您在{c}中使用free()delete)堆内存时,它只是将其标记为可用 - 它不会清除指针或它用来指向的内存;如果您的对象非常大,这样做会降低性能。在内存中,一切都保持完整,直到其他东西使用它。

因为errPtr是在delete之后直接使用的,所以对象仍在内存中。

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

基本上你在做错了就是在它指向的内存被释放后使用指针。一旦你删除了你的对象,你就不会引用它了 - 你必须相信,一旦你调用了delete,你的内存就会自由了。