是否可以删除子功能中的对象? 我在C++中内存泄漏问题。
我创建一个对象(新类型)并将其传递给子函数。 我知道我必须删除该对象以避免内存泄漏-但是,当我在子函数中对该对象调用delete时,这会导致应用程序崩溃:是否可以删除子功能中的对象? 我在C++中内存泄漏问题。,c++,memory-leaks,C++,Memory Leaks,我创建一个对象(新类型)并将其传递给子函数。 我知道我必须删除该对象以避免内存泄漏-但是,当我在子函数中对该对象调用delete时,这会导致应用程序崩溃: void subfunction (TYPE* oldObject,....) { //deep-copy object TYPE* object = new TYPE(oldObject->p1,oldObject->p2,....) subfunction (object,....) delet
void subfunction (TYPE* oldObject,....) {
//deep-copy object
TYPE* object = new TYPE(oldObject->p1,oldObject->p2,....)
subfunction (object,....)
delete oldObject
}
这里有什么问题?我是否必须在创建对象的同一函数中删除该对象
是否不允许删除函数中的对象,该对象是该函数的参数
编辑:错误消息为
“*在“./a.out”中出错:free():无效大小:0x00007fff4fbe59c0*”问题是,您可能在调用子函数(原始调用)之后的原始位置引用了oldObject
干杯。内存管理的问题是,尽管它基本上相当简单(new/new[]->delete/delete[]),但当程序变得更复杂时,它会变得棘手 这就是为什么第一条建议是避免内存管理。这可以通过声明对象而不是指针以及使用标准库容器来实现 如果需要,可以使用来处理内存管理(在析构函数中清理),尤其是智能指针(std::unique_ptr,std::shared_ptr) 使用(新建/删除)进行内存管理时,在同一范围内分配和释放内存,以便更容易跟踪良好的使用情况 如果确实有必要,可以在其他范围(如函数)中执行删除,但这可能会变得非常难以管理 所以在你问题中的代码中,没有直接指向崩溃的东西,所以它必须与你没有展示的代码结合在一起 这里有什么问题 您可能正在删除同一对象两次。当你到处扔指针,希望某个东西在正确的时间删除它时,很容易做到这一点 我是否必须在创建对象的同一函数中删除该对象 你可以在任何地方删除它(只要你只删除一次)。你不应该这样做,因为杂耍指针几乎不可能确保你只做一次 是否不允许删除函数中的对象,该对象是该函数的参数 你可以;但是你不应该这样做,因为打电话的人会留下一个悬空的指针。如果它试图在对象被删除后对其进行任何处理,那么各种错误都可能随之发生
除非你真的需要,否则不要使用新的;并使用智能指针管理通过
new
创建的所有内容。然后,您可以继续编写有用的代码,而不是调试一堆不稳定的内存损坏。您显示的几行代码根本不允许诊断问题。正如其他答案和评论所说,这可能是由于删除了一个对象两次,或者可能是删除了一个不是由new
首先给出的对象。或者可能是其他一些代码正在践踏您的指针,或者偏离分配的对象,并且delete
最终看到的内容已损坏
C++中有很多事情是你可以做的,但并非全部都是好主意。内存管理也很棘手。您可以将大部分内容留给语言(使用容器、智能指针等),也可以寻找一个垃圾收集附加组件
如果要手动操作,请仔细定义以下几点:
new
仅在构造函数中调用,delete
仅在另一个析构函数中调用),但它们可能限制太多(堆上的对象和指针非常棒,因为对象的生命周期不必与代码匹配)
考虑使用内存分配跟踪/调试工具,如valgrind。但不要依赖于它们,找到一个混乱并清理它要比事先计划的工作多得多。而且你可能不会在测试中注意到混乱,而墨菲定律保证它会在最坏的时候崩溃或出现其他不正常的行为。我是最糟糕的开线器;
不幸的是,我的系统崩溃了,我还没有为登录存储垃圾邮件地址,因此我现在只能作为新用户回答
vonbrand实际上给出了正确的提示
c型;
类型*cp=&c;
这样的元素是如何删除的?可能是在其作用域的末尾自动删除的,这导致了第二次删除操作,从而导致了我的问题。我在子函数调用之前复制了该对象-因此每个子函数都有自己的旧对象,该对象在其中被删除。我没有看到任何更改,即一个对象被删除两次。@user3355815:我想这可能会成为并发程序中的一个问题,不是吗?(我的程序还没有并发,但它计划成为并发的)我创建了一个数据结构(对象)的副本