0

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

我有以下代码正在运行,但有两个问题。

分配后我必须在哪里使用 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

请指教

4

5 回答 5

6

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

理想无处new并且delete是不适合大多数代码的 C++ 特性。它们容易出错且级别太低。它们仅对基本构建块有用。

显示的代码可以受益于基本的构建块std::string,如std::vector.


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

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

数组是从 0 开始的,所以function[1]是越界访问。

于 2012-04-22T18:04:24.553 回答
4

你应该调用delete[]你的类的析构函数。

//Called when your class is destroyed.
automobile::~automobile()
{
   delete[] function;
}
于 2012-04-22T17:56:11.060 回答
2
  1. 你应该将delete[]forfunctiontype放在析构函数 ~automobile中(你目前没有,所以你必须创建它)。

  2. 关于输出:您的角色是数组定义不明确。考虑std::vector<string>用于此类事情(容易得多)。

于 2012-04-22T17:59:56.100 回答
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");

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

话虽如此,您几乎应该总是尝试消除对 new 和 delete 的手动调用。它有助于可维护性,并有助于保持代码异常安全。在这种情况下,您可以通过使用标准 C++ 库提供的向量和字符串免费获得它。在更一般的意义上,您要遵循RAII Idiom。这将有助于 C++ 和内存管理在你的学习/职业生涯中减少几年的时间。

于 2012-04-22T18:18:31.810 回答
1

内部〜汽车析构函数。

于 2012-04-22T17:56:09.623 回答