如何指示需要删除返回值? 我通常不是C++开发人员。我的常用语言都是垃圾收集的,他们为我做工作,但是C++使我感兴趣。

如何指示需要删除返回值? 我通常不是C++开发人员。我的常用语言都是垃圾收集的,他们为我做工作,但是C++使我感兴趣。,c++,memory-management,C++,Memory Management,关于返回动态分配的对象或结构,我有一两个问题。我的理解是,它们必须动态分配,以便数据位于堆中而不是堆栈中。如果我错了,请纠正我 返回指针的最佳实践是什么?假设我正在编写一个库,我如何在代码中指示是否/何时应该删除返回的指针?如果返回数组,如何返回数组的大小 这些不是我在C#或javascript中必须面对的问题。这些问题是双向的:如果我在使用别人的库,我应该寻找什么?C++有一个成语叫RAII。这对您来说意味着,您不必担心清理问题,资源将在代码中定义的某个点释放 例如,在函数中生成一个数组并返回

关于返回动态分配的对象或结构,我有一两个问题。我的理解是,它们必须动态分配,以便数据位于堆中而不是堆栈中。如果我错了,请纠正我

返回指针的最佳实践是什么?假设我正在编写一个库,我如何在代码中指示是否/何时应该删除返回的指针?如果返回数组,如何返回数组的大小


这些不是我在C#或javascript中必须面对的问题。这些问题是双向的:如果我在使用别人的库,我应该寻找什么?

C++有一个成语叫RAII。这对您来说意味着,您不必担心清理问题,资源将在代码中定义的某个点释放

例如,在函数中生成一个数组并返回它。下面是一个没有RAII的典型实现(另一个是调用方分配内存并传入):

现在,调用方需要记住释放此内存。将其与RAII版本进行比较:

std::vector<int> makeIntArray(std::size_t length) {
    return std::vector<int>(length);
}
没有动态分配意味着没有额外的工作,无论是释放内存,还是将其封装在某些东西中(在本例中是智能指针,如
std::unique\u ptr

至于其他库,您需要阅读文档以确保您必须拥有它返回的内容。如果必须的话,你可以做的一件事就是用它制作一个RAII对象。例如:

int *makeSomeInt(int value) {
    return new int(value);
}

...

std::unique_ptr<int> myInt(makeSomeInt(5));
//memory freed when myInt goes out of scope
int*makeSomeInt(int值){
返回新的int(值);
}
...
std::unique_ptr myInt(makeSomeInt(5));
//myInt超出范围时释放的内存

我知道克里斯已经给出了一个很好的答案。除此之外,还有几点需要补充:

  • 不要在代码中分配动态内存。让库尽可能多地完成动态内存分配(和释放)。(请参见上面的
    向量
    示例。)

  • 如果您必须自己进行动态内存分配,那么每个内存(即指针)都必须有一个所有者。内存的构造和破坏应该是所有者,其他人只能使用它

  • 如果您使用的是C++11,那么请熟悉
    unique\u ptr
    ,这是您最常用的工具

    从s:

    C++11中有很多很棒的特性,但unique_ptr非常突出 在卫生规范方面。简单地说,这是一个神奇的子弹 动态创建的对象


简短回答:使用RAII(像智能指针一样)。RAII对我来说是新手。我必须阅读更多关于它的内容。“如果我正在使用其他人的库,我应该寻找什么?”不幸的是,如果你看到库函数返回指针,你需要寻找该库的文档:(对于C++98,仍然有std::auto_ptr,你可以(而且应该!)我认为最后一个例子有点误导,它假设
makeSomeInt()
无法更改。如果您可以更改它,您可以记录它返回返回指针的所有权,并立即使用unique_ptr/auto_ptr。@doomster,这应该是一个适合该领域讨论如何为其他库执行操作的示例。我想,该部分本身可以使用较少的歧义。
Str makeStr() {
    return Str();
}
int *makeSomeInt(int value) {
    return new int(value);
}

...

std::unique_ptr<int> myInt(makeSomeInt(5));
//memory freed when myInt goes out of scope