C++ C++;新及;删除和删除函数

C++ C++;新及;删除和删除函数,c++,new-operator,delete-operator,C++,New Operator,Delete Operator,这对我来说有点不清楚。。。如果我有一个函数: char *test(int ran){ char *ret = new char[ran]; // process... return ret; } 然后多次调用它: for(int i = 0; i < 100000000; i++){ char *str = test(rand()%10000000+10000000); // process... // delete[] str; // do

这对我来说有点不清楚。。。如果我有一个函数:

char *test(int ran){
    char *ret = new char[ran];
    // process...
    return ret;
}
然后多次调用它:

for(int i = 0; i < 100000000; i++){
   char *str = test(rand()%10000000+10000000);
   // process...

   // delete[] str; // do i have to delete it here?
}
for(int i=0;i<100000000;i++){
char*str=test(rand()%10000000+10000000);
//过程。。。
//delete[]str;//我必须在这里删除它吗?
}

所以问题是,我是否必须为每个
新[]
呼叫使用
delete[]


不过,在一个函数中分配,在另一个函数中释放并不是最好的主意。为什么不在for循环中分配并将指针传递到
test
——这样可以将
new
delete
一起保存在代码中。

您不必这样做。但是如果你不删除你用“新”保留的内存,你最终会开始内存不足(内存泄漏)。

< P>已经给出了答案,但是当你把问题标记为C++,而不是C,这就是你可能想要在C++中做的(当然,可能还有其他原因,但几乎没有机会)。
vector(int-ran){
向量ret(char);
//过程。。。
返回ret;
}
并称之为:

for(int i = 0; i < 100000000; i++){
   vector<char> str = test(rand()%10000000+10000000);
   // process...
}
for(int i=0;i<100000000;i++){
向量str=test(rand()%10000000+10000000);
//过程。。。
}
没有新的,因此没有删除,因此没有内存泄漏

实际上,您可能还希望使用std::string而不是char*(我使用vector给出了一个更一般的示例)

不要担心会被复制的数据。编译器将对其进行优化。
编辑:好的,它可能不会对其进行优化:)但是有很大的可能性。只要没有性能问题,就可以选择最简单的版本。

这似乎是一个常见的C++问题。通常,如果您使用的是同一个类,则需要在同一个类中调用
new
delete
。否则我很想看看人们怎么说。这样做完全可以,而且很普遍。废话。这将需要一段时间来修复:D@Newbie:我希望您的实际代码中没有这么大的内存分配。它肯定会抛出一个
std::bad_alloc
异常,否则表示内存分配失败。不,这只是一个例子,新的[]内存分配大小是否有一定的限制。。。?在我的例子中,它的最大值为20毫克…@Neil很多事情都很好,但仍然不是一个好主意。:)啊,是的,这是有道理的,因为我的程序似乎每次都在使用越来越多的内存:驻留,这不比说“它将复制向量并导致性能损失”更像是一个谎言。但我还是编辑了它:)
for(int i = 0; i < 100000000; i++){
   vector<char> str = test(rand()%10000000+10000000);
   // process...
}