如何判断是否删除函数返回的指针

Mas*_*tic 2 c++ memory-leaks

考虑一个返回a的函数,Type*所以看起来它可以Type在其定义中分配一个,但你无法确定(有很多函数,你没有时间阅读它们的定义).

你怎么知道你是否应该删除返回的指针?例如,这是类型:

struct MyStruct
{
    MyStruct(void) { cout << "Created.\n"; }
    ~MyStruct(void) { cout << "Deleted.\n"; }
};
Run Code Online (Sandbox Code Playgroud)

这是功能:

MyStruct* Func1(void)
{
    return (new MyStruct());
}
Run Code Online (Sandbox Code Playgroud)

Func1分配了一个指针,您应该稍后取消分配它.但也许定义是别的,指针不应该是deleted.

我的问题是:你如何判断是否删除指针?例如:也许指针是静态的?

MyStruct* Func2(void)
{
    static MyStruct* ms = &MyStruct();
    return ms;
}
Run Code Online (Sandbox Code Playgroud)

取消分配此指针会使整个程序崩溃.

提前致谢.

Oli*_*rth 8

无法以编程方式检查此内容.1 作为程序员,您需要了解需要删除的内容和不需要删除的内容.

更一般地说,这是通过在C++中传递原始指针的一个原因经常不赞成. 智能指针通常用于管理动态分配的内存.


1.至少,不是一种强大的平台无关的方式.

  • 究竟.OP的"你没有时间阅读他们的定义"不是一种选择. (2认同)

Mik*_*our 7

你怎么知道你是否应该删除返回的指针?

你不能,这就是为什么使用原始指针来管理内存是一个非常糟糕的主意.如果对象需要删除,则应始终使用智能指针自动完成.

这也有一个好处,即动态对象一旦完成就会被删除,即使抛出异常也是如此.

std::unique_ptr<MyStruct> Func1()
{
    return std::unique_ptr<MyStruct>(new MyStruct);
}

void do_something()
{
    auto thing = Func1();
    do_something_with(thing);

    // The object is automatically deleted here
    // even if the function threw an exception.
}
Run Code Online (Sandbox Code Playgroud)

如果您被迫使用设计糟糕的库,其函数返回指针可能需要或可能不需要删除,那么您唯一的选择是阅读文档或找到更好的库.立即将任何需要删除的指针分配给智能指针是个好主意,因此您至少可以获得异常安全性.