分配后我在哪里可以释放内存?

时间:2012-04-22 17:50:39

标签: c++

我正在尝试做一些内存分配练习。

我有以下代码,但有两个问题。

在分配后,我必须在哪里使用delete []来释放内存?

为什么使用show()函数时此代码的输出是CDcar?。

#include <cstdlib>
#include <new>
#include <iostream>
#include <cstring>
using namespace std;

class automobile {

    private:

        char (*function)[30];
        char *type;
        double speed;

    public:

        automobile ( );
        automobile (double , char *);
        void speed_up (double);
        void speed_down(double);
        const char * get_function ( ) const;
        void show ( );

};

automobile::automobile ( ) {

    speed = 0;
    function = new char [1][30];
    strcpy(function[1], "CD player with MP3");

    type = new char [4];
    strcpy(type, "car");

}

automobile::automobile(double spd, char * fn ) {

    int sz;

}

void automobile::show ( ) {

    cout << "This is a " << type << " and it has the following functions: " << function[1] << ", and its speed is " << speed << " km/h\n"; 

}

int main ( ) {

    automobile car;

    car.show ( );

    return 0;
}

这是输出:

This is a car and it has the following functions: CDcar, and its speed is 0 km/h

我认为输出应该是这样的:

This is a car and it has the following functions: CD player with MP3, and its speed is 0 km/h

请告知

5 个答案:

答案 0 :(得分:6)

  

在分配后,我必须在哪里使用delete []来释放内存?

理想情况下无处newdelete是C ++的功能,不适合大多数代码。它们容易出错,而且级别太低。它们只对基本构建块有用。

显示的代码可以从std::stringstd::vector等基本构建模块中受益。


显示的代码也至少在一个地方调用未定义的行为:

function = new char [1][30];
strcpy(function[1], "CD player with MP3");

数组是从0开始的,因此function[1]是一个越界访问。

答案 1 :(得分:4)

您应该在班级的析构函数中调用delete[]

//Called when your class is destroyed.
automobile::~automobile()
{
   delete[] function;
}

答案 2 :(得分:2)

  1. 您应该将delete[]function type放在destructor ~automobile内(目前还没有,{}我将不得不创造它。

  2. 关于输出:您的字符数组未定义良好。考虑使用std::vector<string>来做这些事情(更容易)。

答案 3 :(得分:2)

您的输出不正确b / c以下内容:

 speed = 0;
 function = new char [1][30];
 strcpy(function[1], "CD player with MP3");

这应该是

 speed = 0;
 function = new char [1][30];
 strcpy(function[0], "CD player with MP3");

当你输出时,你应该是function[0]而不是function[1]

说完这个之后,你几乎总是试图消除对new和delete的手动调用。它有助于维护,并有助于保持代码异常安全。在这种情况下,您可以使用标准C ++库提供的向量和字符串免费获得。从更一般的意义上讲,您希望遵循RAII Idiom。这将有助于C ++和内存管理在学习/职业生涯中缩短你的生命。

答案 4 :(得分:1)

内部〜汽车破坏者。