首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以删除子函数中的对象?

是否可以删除子函数中的对象?
EN

Stack Overflow用户
提问于 2014-02-26 12:42:28
回答 5查看 116关注 0票数 0

我对C++中的内存泄漏有问题。

我创建一个对象(新类型)并将其传递给一个子函数。我知道为了避免内存泄漏,我必须删除对象--但是,当我在子函数中调用delete对象时,这会导致应用程序崩溃:

代码语言:javascript
复制
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 *

EN

回答 5

Stack Overflow用户

发布于 2014-02-26 13:05:05

这里有什么问题?

你可能要删除同一对象两次。这很容易做到,当你在周围扔指针,并希望某些东西删除它在正确的时间。

我是否必须删除同一个函数中的对象?

你可以在任何地方删除它(只要你做了一次)。您不应该这样做,因为杂耍指针使您几乎不可能确保您做了准确的一次。

是否允许删除函数中的对象,而该对象是该函数的参数?

您可以这样做;但是您不应该这样做,因为调用者将被留下一个悬空的指针。如果在对象被删除后,它试图对它做任何事情,那么就会产生各种错误。

除非您真的需要new,否则不要使用它;并使用智能指针来管理使用new创建的所有东西。然后,您可以继续编写有用的代码,而不是调试一堆摇摇欲坠的内存损坏。

票数 2
EN

Stack Overflow用户

发布于 2014-02-26 12:50:43

问题是,您可能是在调用子函数(原始调用)之后在其原始位置引用oldObject。

干杯。

票数 0
EN

Stack Overflow用户

发布于 2014-02-26 13:03:56

内存管理的问题是,虽然它基本上相当容易(new/new[] -> delete/delete[]),但当程序变得更加复杂时,它就变得棘手了。

这就是为什么第一个建议是避免内存管理。这可以通过声明对象而不是指针和使用标准库容器来实现。

如果需要,可以使用雷伊来处理内存管理(在析构函数中清除),特别是智能指针(std::unique_ptr、std::shared_ptr)。

当使用(新/删除)进行内存管理时,在相同的范围内分配和释放内存,这样就更容易跟踪良好的使用情况。

如果确实有必要,可以在其他范围内进行删除,比如函数,但很难管理。

所以在你问题中的代码中,没有任何直接指向崩溃的地方,所以它必须与你没有显示的代码结合在一起。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22041763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档