实例化并删除对象C++
Instantiate and Delete an object 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();方法?
errPtr->showError("hello"); //This line is being executed normally like object still exist.
不过,这只是未定义的行为。
如果取消引用之前为delete
d的指针,则可能发生任何事情,包括看似正确的行为。
实例化和删除的方式没有错——发生的事情取决于内存的分配方式(或者在这种情况下更合适的是释放)。
当您使用free()
(c++中的delete
)堆内存时,它只是将其标记为可用——它不会清除您的指针或它用来指向的内存;这样做会降低性能,尤其是在对象很大的情况下。在其他人使用它之前,所有东西都会原封不动地保存在内存中。
由于errPtr直接在delete
之后使用,因此对象仍在内存中。
C++不会阻止你在删除指针后使用它,但这样做是一个非常糟糕的主意,因为你的指针现在指向可能被其他东西使用的内存。
基本上,你在这里做错的是在它所指向的内存被释放后使用指针。一旦你删除了你的对象,就要决定不引用它——你必须相信,一旦你调用了delete
,内存现在是空闲的。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- 使用"std::unordereded_map"映射到"std::list"对象