C++ 此代码是否会导致内存泄漏问题?

C++ 此代码是否会导致内存泄漏问题?,c++,visual-c++,C++,Visual C++,考虑到下面的代码,如果我像这样使用Die类的实例,会发生什么 Die d; d.Roll(20); d.Roll(15); d.Roll(30); 在再次为值分配内存之前,是否应该释放值占用的内存删除[]在新建之前 die.h #ifndef DIE_H #define DIE_H #include<iostream> #include<time.h> using namespace std; class Die { private: int number;

考虑到下面的代码,如果我像这样使用
Die
类的实例,会发生什么

Die d;
d.Roll(20);
d.Roll(15);
d.Roll(30);
在再次为值分配内存之前,是否应该释放值占用的内存<代码>删除[]在
新建之前

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
\ifndef DIE\u H
#定义模具
#包括
#包括
使用名称空间std;
级模
{
私人:
整数;
int*值;
整数计数;
空辊();
公众:
Die(){srand(static_cast(time(NULL));number=0;value=NULL;count=0;}
空辊(int n);
int getNumber()常量{return number;}
void printLastValue();
无效打印值();
~Die(){delete[]值;}
};
#恩迪夫
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;
    }
}
#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();
}
#包括“die.h”
#包括
#包括
使用名称空间std;
无效模具::滚动()
{
数字=1+rand()%6;
}
无效模具::printLastValue()
{

cout是,如果您多次调用
Roll
,这将导致内存泄漏。您应该检查值是否为
NULL
,如果不是,则调用
delete[]

编辑:
正如下面所评论的,您不必检查null,您可以安全地在null指针上调用delete。这只是我工作的公司标准中长期养成的习惯

您应该考虑使用
std::vector
而不是数组。这样做可以消除内存泄漏的危险,并且不再需要显式定义析构函数。您可以用以下内容替换

std::vector<int> values;
std::向量值;
然后在滚动代码中,您可以执行以下操作:

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

对于(int i=0;i您肯定需要删除它们,因为您正在重新分配Die::值,从而导致内存泄漏


编辑:在这种情况下,使用std::vector比使用原始数组更好。这样,您就不需要删除任何内容,只需在Die::Roll的开头调用std::vector::clear即可。

是的,它会泄漏内存。如果您这样做

值=新整数[len]


它使用数组分配新内存,并将值指向新内存位置。旧内存位置仍然包含旧数据,需要在分配新数据之前删除旧数据。

每次只需调用
delete[]
,因为delete[]在空指针上什么都不做。@ IPC-我知道删除NULL是安全的,它只是检查空的习惯。我也每天在C++和C语言之间来回切换,调用“处置”是不安全的。在nullptrBy定义中,除非在运行时将对
new
的每次调用与对
delete
(或
delete[]
用于数组分配)的相应调用相匹配,否则程序会泄漏内存。您的运行时可以/确实调用连续的
new
调用,覆盖相同的目标变量,而无需中间
delete[],是的,这就像泰坦尼克号一样泄漏。请自己帮个忙,烧掉你的书(或者你现在正在学习的任何东西)C++ C++。和这个问题无关,但是你应该看看使用构造函数而不是在构造函数的主体中设置所有这些值。这是Scott Meyers改进C++程序的55种方法之一。(它是有效C++中第4项的一部分)以及
values.clear()
values.reserve(n)
Die::Roll(int)
方法的开头。