2012-04-06 85 views
0

我想动态分配一个新的对象。C++内存分配新[]和删除[]

int len = (nm == NULL) ? 0 : strlen(nm); 

try { 
    name = new char[len + 1]; 
} 
catch(std::bad_alloc) { 
    name = NULL; 
} 
if(name) { 
    if(nm == NULL) 
     strcpy(name, ""); 
    else 
    { 
     strcpy(name, nm); 
     cmds=new command [num_of_cmds]; 

然后我的析构函数已经被他们通过

robot::~robot() 
{ 
if (name) { 
    delete[] name; 
} 
delete [] cmds; 
} 

我不断收到segementation故障,如果我修改一些代码,在一个简单的INT初始化值删除,它打破。我的删除[] CMD中断,所以我必须评论它。任何帮助将不胜感激。如果人们需要,我会澄清更多的事情。

+2

发表一个小的自编可以演示你的问题的例子。注意看你的代码,有很多东西需要改进。而且,这个例子甚至不会编译,我怀疑这是*代码不是*原始*代码。 – 2012-04-06 07:25:31

+0

我很确定我看到这个代码两天前.. http://stackoverflow.com/questions/10001614/c-vector-arrays-in-copy-constructors – 2012-04-06 07:27:28

+1

@amit:虽然代码是完全灾难性的,我不看不到'cmds'在任何地方被声明。我只看到它被分配,并不知道它是否是成员。 – 2012-04-06 07:28:54

回答

1

当您的机器人的名称为NULL(nm == NULL)时,您分配一个空字符串,但不要分配cmds。所以你至少应该在该分支中将cmds设置为NULL,或者在delete [] cmds;之前检查析构函数if (name && *name != 0)。我用的第一个选项去...

0

除非你有一个非常理由不,你应该避免使用new[]delete[],而使用std::stringstd::vector。这些处理你的内存管理;并因此而使用起来相当容易。

std::vector比手动分配的缓冲区更有用,不仅因为它为您处理内存,而且它仍然与旧的C风格API兼容。在需要提供const char *char *的情况下,您可以简单地提供&vec[0](如std::vector的第一个元素的地址)。

std::string使内存管理,字符串处理,和(与std::stringstream一起)字符串格式化很多很多,容易。不要试图自己处理内存管理,请使用经过良好测试的std::stringstd::vector