我正在尝试做一些内存分配练习。
我有以下代码,但有两个问题。
在分配后,我必须在哪里使用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
请告知
答案 0 :(得分:6)
在分配后,我必须在哪里使用delete []来释放内存?
理想情况下无处。 new
和delete
是C ++的功能,不适合大多数代码。它们容易出错,而且级别太低。它们只对基本构建块有用。
显示的代码可以从std::string
,std::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)
您应该将delete[]
和function
type
放在destructor ~automobile
内(目前还没有,{}我将不得不创造它。
关于输出:您的字符数组未定义良好。考虑使用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)
内部〜汽车破坏者。