2010-06-03 64 views
3

这是一个有点不清楚,我...所以,如果我有一个函数:C++新和删除和功能

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[]吗?

+0

这似乎是一个常见的C++问题。一般来说,如果您使用的是同一个类,则需要调用'new'和'delete'。否则我很想看看人们说什么。 – 2010-06-03 12:38:50

回答

5

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

+0

啊,是的,这是有道理的,因为我的程序似乎每次都使用越来越多的内存:D – Newbie 2010-06-03 12:44:40

5

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

尽管在一个函数中分配并且在另一个函数中释放并不是最好的想法。为什么不在for循环中分配并将指针传递给test - 这将newdelete保留在代码中。

+3

这样做完全可以,而且很常见。 – 2010-06-03 12:39:26

+0

废话。这需要一段时间才能解决:D – Newbie 2010-06-03 12:43:42

+0

@Newbie:我希望你在实际的代码中实际上不是那么大的内存分配。它肯定会抛出一个'std :: bad_alloc'异常,否则表示内存分配失败。 – Naveen 2010-06-03 12:46:00

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来给出一个更一般的例子)。

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

+0

“编译器会优化它。” < - 这种方式是疯狂的...... – zildjohn01 2010-06-03 12:55:48

+0

好吧,这并不比说“它会复制矢量并导致性能损失”更困难。但我仍然编辑它:) – 2010-06-03 12:59:28