2012-11-21 89 views
2

考虑下面的代码,如果我使用Die类的实例,这样会发生什么:此代码是否会导致内存泄漏问题?

Die d; 
d.Roll(20); 
d.Roll(15); 
d.Roll(30); 

我应该或者我应该不会再alocating内存之前,释放由值所占用的内存? delete[ ]之前new

die.h

#ifndef DIE_H 
#define DIE_H 
#include<iostream> 
#include<time.h> 
using namespace std; 


class Die 
{ 
private: 
    int number; 
    int* values; 
    int count; 
    void roll(); 
public: 
    Die(){srand(static_cast<int>(time(NULL)));number=0;values=NULL;count=0;} 
    void Roll(int n); 
    int getNumber()const{return number;} 
    void printLastValue(); 
    void printValues(); 
    ~Die(){delete [] values;} 

}; 

#endif 

die.cpp

#include"die.h" 
#include<iostream> 
#include<time.h> 
using namespace std; 

void Die::roll() 
{ 

    number=1+rand()%6; 
} 

void Die::printLastValue() 
{ 
    cout<<number<<endl; 
} 

void Die::Roll(int n) 
{ 
    count=n; 
    values=new int[count]; 
    for(int i=0;i<count;i++) 
    { 
     roll(); 
     values[i]=number; 
    } 

} 
void Die::printValues() 
{ 
    for(int i=0;i<count;i++) 
    { 
     cout<<values[i]<<endl; 
    } 
} 

的main.cpp

#include"die.h" 
#include<iostream> 
using namespace std; 

int main() 
{ 
    Die d; 
    d.Roll(25); 
    d.printValues(); 
    d.Roll(40); 
    d.printValues(); 
    d.Roll(100); 
    d.printValues(); 
    d.printLastValue(); 
} 
+0

根据定义,您的程序会泄漏内存,除非您在运行时**在每次调用'new'时调用'delete'(或'delete []'调用数组)。你的运行时可以调用连续的'new'调用,覆盖相同的目标变量,而不需要中间的'delete []',所以是的,这就像泰坦尼克号一样泄漏。 – WhozCraig

+4

帮你一个忙,烧你的书(或者你正在学习“C++”)和[得到一个体面的](http://stackoverflow.com/questions/388242/)。 – fredoverflow

+0

与此问题无关,但您应该查看使用构造函数[初始化程序列表](http://www.learncpp.com/cpp-tutorial/101-constructor-initialization-lists/)而不是将所有这些值设置为构造函数的主体。它是Scott Meyers改进C++程序的55种方法之一(它是Effective C++中第4项的一部分) – pstrjds

回答

5

是的,这就会造成内存文件如果您多次致电Roll,请联系我们。您应该检查值是否为NULL,如果不是,则请致电delete []

编辑:
正如下面的评论,你不必检查为null,你可以安全地调用删除空指针。它只是我用来工作的公司标准中的一个长期习惯。

你应该使用std::vector而不是数组来看看。通过这样做,您将消除内存泄漏的危险,并且不再需要显式定义析构函数。你可以取代你的values与此:

std::vector<int> values; 

然后在你的代码滚动,你可以这样做:

void Die::Roll(int n) { 
    count=n; 
    values.clear(); 
    for(int i=0;i<count;i++) 
    { 
     roll(); 
     values.push_back(number); 
    } 
} 
+3

每次都简单地调用delete [],因为delete []在空指针上不做任何事情。 – ipc

+1

@ipc - 我知道删除null是安全的,它只是检查null的旧习惯。我也每天在C++和c#之间来回切换,并且在nullptr – pstrjds

+1

'values.reserve(n)'上调用“Dispose”并不安全,它们将会在'values.clear()'之后变得明智。 – Omnifarious

3

你一定要删除它们,因为你正在重新分配模具::值,造成内存泄漏。

编辑:在这种情况下,最好使用std :: vector比原始数组。那么你不需要删除任何东西,只需在Die :: Roll的开头调用std :: vector :: clear即可。

+1

以及'Die :: Roll(int)'方法开始的'values.clear()'和'values.reserve(n)'。 – Omnifarious

1

是的,它会泄漏内存。当你做

Values = new int [len];

它为阵列分配新的内存并将值指向新的内存位置。旧的内存位置仍然包含在分配新数据之前需要删除的旧数据。

相关问题