我试图实例化一个对象并在之后删除它,我做错了什么?
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();删除它后的方法?
答案 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
,你的内存就会自由了。