我对C++中的内存泄漏有问题。
我创建一个对象(新类型)并将其传递给一个子函数。我知道为了避免内存泄漏,我必须删除对象--但是,当我在子函数中调用delete对象时,这会导致应用程序崩溃:
void subfunction (TYPE* oldObject,....) {
//deep-copy object
TYPE* object = new TYPE(oldObject->p1,oldObject->p2,....)
subfunction (object,....)
delete oldObject
}这里有什么问题?我是否必须删除同一个函数中的对象?
是否允许删除函数中的对象,而该对象是该函数的参数?
编辑:错误消息是'* error in‘./a.out’:free():无效大小: 0x00007fff4fbe59c0 *‘
发布于 2014-02-26 13:05:05
这里有什么问题?
你可能要删除同一对象两次。这很容易做到,当你在周围扔指针,并希望某些东西删除它在正确的时间。
我是否必须删除同一个函数中的对象?
你可以在任何地方删除它(只要你做了一次)。您不应该这样做,因为杂耍指针使您几乎不可能确保您做了准确的一次。
是否允许删除函数中的对象,而该对象是该函数的参数?
您可以这样做;但是您不应该这样做,因为调用者将被留下一个悬空的指针。如果在对象被删除后,它试图对它做任何事情,那么就会产生各种错误。
除非您真的需要new,否则不要使用它;并使用智能指针来管理使用new创建的所有东西。然后,您可以继续编写有用的代码,而不是调试一堆摇摇欲坠的内存损坏。
发布于 2014-02-26 12:50:43
问题是,您可能是在调用子函数(原始调用)之后在其原始位置引用oldObject。
干杯。
发布于 2014-02-26 13:03:56
内存管理的问题是,虽然它基本上相当容易(new/new[] -> delete/delete[]),但当程序变得更加复杂时,它就变得棘手了。
这就是为什么第一个建议是避免内存管理。这可以通过声明对象而不是指针和使用标准库容器来实现。
如果需要,可以使用雷伊来处理内存管理(在析构函数中清除),特别是智能指针(std::unique_ptr、std::shared_ptr)。
当使用(新/删除)进行内存管理时,在相同的范围内分配和释放内存,这样就更容易跟踪良好的使用情况。
如果确实有必要,可以在其他范围内进行删除,比如函数,但很难管理。
所以在你问题中的代码中,没有任何直接指向崩溃的地方,所以它必须与你没有显示的代码结合在一起。
https://stackoverflow.com/questions/22041763
复制相似问题