如何指示需要删除返回值? 我通常不是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,那么请熟悉
,这是您最常用的工具 从s: C++11中有很多很棒的特性,但unique_ptr非常突出 在卫生规范方面。简单地说,这是一个神奇的子弹 动态创建的对象unique\u 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