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
-但是为什么需要创建
新的
ed
std::vector
?更好的方法是除非需要,否则不要在堆上分配。类似于
foo.func(pV)可能是您真正需要的所有内容。@Mat Point take-将
auto_ptr
替换为
unique_ptr
,并解释了魔法删除发生的位置。感谢您的回复,我认为您的回答是我问题的最佳答案。添加-新的
pV
将仅存在于调用的函数“空间”中,并且可以(应该)在其内部删除
。在进一步修改代码后,我了解到我可以在不使用
new
操作符的情况下调用函数。
std::vector<int> myvec(pV);
foo->func(&myvec);