我得到了以下代码。它汇编得很好。
class A
{
public:
static std::vector<int> vInt;
static std::vector<int> Foo()
{
std::vector<int> tmp;
// EDIT: in the real application the values
// inserted in the vector depends on the result
// of other functions being called before Foo()
tmp.push_back(7);
tmp.push_back(9);
return tmp;
}
};
std::vector<int> A::vInt;
int main()
{
// .... some code
A::vInt = A::Foo();
// .... more code
}
但我想知道它是否有内存泄漏?
我在想这行:
std::vector<int> A::vInt;
正在构建一个向量(一个空向量)。
但该行后来被该行替换:
A::vInt = A::Foo();
所以第一个向量永远不会被破坏而且我有内存泄漏。 这是对还是错?
编辑: 我的初始排队没有提到在实际应用程序中我不能从一开始就调用Foo()。 Foo()返回的值取决于需要首先调用的其他函数。很抱歉不清楚...
答案 0 :(得分:2)
通常,除非使用new
运算符,否则不必担心泄漏。由于你没有动态分配(在堆上),任何东西都不会泄露;堆栈中的所有内容都将由确定性破坏来处理。
答案 1 :(得分:1)
因为您使用std::vector
,所以没有泄漏。标准库会为您处理。
答案 2 :(得分:1)
你没有泄密,但代码对我来说仍然很复杂。我更喜欢这样的东西:
#include <vector>
class A
{
public:
static std::vector<int> vInt;
};
std::vector<int> A::vInt{ 7, 9 };
int main()
{
A a;
}
但一般来说,从函数返回局部向量是完全安全的。
理论上,编译器将编译器复制或移动到本地向量中,然后销毁本地。然后它将临时文件复制或移动到目的地并销毁临时文件。
标准明确允许绕过它 - 编译器可以(并且大多数)将对目标的引用传递给函数。函数中的代码将通过该引用直接写入目标,因此根本不会进行任何复制或移动。
仍然:在这种情况下,这是毫无意义的。只需初始化你定义它的向量,你就完成了(当然,除非你使用的是一个不支持它的旧编译器 - 但在这种情况下,如果可能的话,最好更新编译器,而不是编写蹩脚的代码以适应旧的编译器。
答案 3 :(得分:1)
您的代码不会泄漏。 Foo()返回的输出将被覆盖在A :: vInt的同一地址。 检查下面的Valgrind输出,这也表明没有泄漏:
==25088== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 1)
==25088== malloc/free: in use at exit: 0 bytes in 0 blocks.
Write failed: Cannot allocate memoryrees, 20 bytes allocated.
Amits-MacBook-Pro:~ kamal$ ected errors, rerun with: -v
==25088== All heap blocks were freed -- no leaks are possible.