3

这对我来说有点不清楚......所以,如果我有一个功能:

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?
}

所以问题是,我必须delete[]为每个new[]电话使用吗?

4

3 回答 3

5

是的,你这样做,否则你会有内存泄漏。

不过,在一个函数中分配而在另一个函数中释放并不是最好的主意。为什么不在 for 循环中分配并将指针传递给test- 这将newand保持delete在代码中。

于 2010-06-03T12:37:50.920 回答
5

不必。但是如果你不删除你用'new'保留的内存,你最终会开始耗尽内存(内存泄漏)。

于 2010-06-03T12:44:02.250 回答
3

答案已经给出,但是当您将问题标记为 C++ 而不是 C 时,这就是您可能希望在 C++ 中执行此操作的方式(当然,可能还有其他原因不这样做,但机会很小)。

vector<char> (int ran){
    vector<char> ret(char);
    // process...
    return ret;
}

并称之为:

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

没有新的,因此没有删除,因此没有内存泄漏。

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

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

于 2010-06-03T12:52:46.550 回答