C++ 函数调用中的新运算符
我的问题是在函数调用中分配了C++ 函数调用中的新运算符,c++,new-operator,C++,New Operator,我的问题是在函数调用中分配了new操作符的对象会发生什么情况 一个具体的例子:我有一个私有向量pV,我想将它发送到类之外的对象/函数,foo->func(std::vector*vec)。我第一次尝试写作 foo->func( new std::vector<int>(pV) ) foo->func(新标准::向量(pV)) 但这导致了内存泄漏(当在循环中重复调用所述函数时)。当我专门创建了一个名为函数的新对象,然后删除了该对象时,整个过程正常运行,没有内存泄漏 新创建的对
new
操作符的对象会发生什么情况
一个具体的例子:我有一个私有向量pV
,我想将它发送到类之外的对象/函数,foo->func(std::vector*vec)
。我第一次尝试写作
foo->func( new std::vector<int>(pV) )
foo->func(新标准::向量(pV))
但这导致了内存泄漏(当在循环中重复调用所述函数时)。当我专门创建了一个名为函数的新对象,然后删除了该对象时,整个过程正常运行,没有内存泄漏
新创建的对象不应该“过期”并在函数返回时删除吗?如果没有,我应该如何从被调用函数中删除对象?哪种方法更好?在C++中没有新对象“过期”这样的事情:它不是一种垃圾收集或引用计数语言,因此您需要手动编码分配给
new
或new[]
的对象的所有内存管理
在这种情况下,您可以使用unique\ptr
来确保自动删除:
for (int i = 0 ; i != 10000 ; i++) {
std::unique_ptr<std::vector<int> > tmp = new std::vector<int>(pV);
foo->func(tmp);
}
我认为最好的办法是两者都不要。
只需传递
pV
本身即可。它将被复制(通过复制构造函数),因此无论如何都会创建一个新的向量。它将在函数返回时自动销毁。分配了new
的对象最终必须通过delete
释放,否则将发生泄漏。使用new
分配与函数调用无关-您可以在一个函数中使用new
创建一些内容,并在另一个函数中使用delete
释放它,而不会出现问题
如果您想要在函数中分配并在函数退出时释放的对象,只需执行以下操作:
void foo(...) {
// some code
MyClass myobj(...); // object allocated here
// some more code
return; // object freed here (or whenever function exits)
}
如果需要将指向对象的指针传递给函数,也不需要使用new
;您可以使用和运算符:
std::vector<int> myvec(pV);
foo->func(&myvec);
std::vector myvec(pV);
foo->func(&myvec);
在这种情况下,myobj
是一个自动变量,放置在堆栈上,并在函数退出时自动删除。在这种情况下不需要使用<代码>新的< /代码>。C++中的,如果使用<代码>新< /C>,你需要最终<代码>删除<代码>新数据。这与使用垃圾收集器的Java或C不同。如果您想要自动管理,请使用类似于std::shared\u ptr
-但是为什么需要创建新的edstd::vector
?更好的方法是除非需要,否则不要在堆上分配。类似于foo.func(pV)代码>可能是您真正需要的所有内容。@Mat Point take-将auto_ptr
替换为unique_ptr
,并解释了魔法删除发生的位置。感谢您的回复,我认为您的回答是我问题的最佳答案。添加-新的pV
将仅存在于调用的函数“空间”中,并且可以(应该)在其内部删除。在进一步修改代码后,我了解到我可以在不使用new
操作符的情况下调用函数。
std::vector<int> myvec(pV);
foo->func(&myvec);