Debug Assertion Error - 删除对char指针的调用

时间:2010-08-07 17:58:15

标签: c++ string memory-management

所以我决定在C ++中加入一些内容。

当我在指向我创建的简单类的指针上调用delete函数时,我受到Debug Assertion Failure -Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)的欢迎。我认为这是因为我处理了错误的字符串操作,从而导致内存损坏。

我创建了一个基本类,[I] animal [/ I],它有一个可以通过函数设置的字符串。

// name
char * ptrName;

animal::animal(char * name)
{
 this->SetName(name);
};

animal::~animal()
{
 delete [] ptrName;
}

void animal::SetName(char * name)
{
 ptrName = name;
};

当使用如下所示的上述类时,会发生错误。我已经尝试了delete ptrNamedelete [] ptrName,但无济于事。

animal * cat = new animal("Optimus Prime");
delete cat;

我错过了什么?

5 个答案:

答案 0 :(得分:2)

字符串"Optimus Prime"未动态分配,因此在其上调用delete是不正确的。

答案 1 :(得分:2)

问题来自删除您不拥有的指针。您尚未分配字符串,因此不能删除它。您正在使用的C字符串由编译器静态分配。

答案 2 :(得分:2)

问题是在setName函数中,您只是将名称分配给ptrName。在该示例中,名称是const char字符串指针,您无法删除它(它未在堆上分配)。要避免此错误,您可以在类中使用std :: string,也可以在animal类的构造函数中分配新的char,并为其指定指针。然后,在析构函数中,您可以删除该数组。

答案 3 :(得分:1)

谁拥有你的字符串?

例如,当你构造你的新动物时,你传递的是一个字符串文字 - 这不是你自由的。

你应该考虑避免使用char *而只是使用std :: string。

如果必须使用char *,请考虑所有权。例如,一个选项是您获取字符串的副本(使用strdup)并拥有它。这样你就不会遇到像这样的奇怪错误

char* szFoo = strdup("my string");
{
  animal a(szFoo);
}
// At this point szFoo has been deleted by the destructor of a
// and bad things will start to happen here.
printf("The value of my string %s",szFoo);

答案 4 :(得分:1)

  

所以我决定在C ++中加入一些内容。

然后帮自己一个忙,并使用C ++ 。那就是使用std::string

// name
std::string name_;

animal::animal(const std::string& name)
  : name_(name)
{
}

//animal::~animal() // not needed any longer

//note: copying also automatically taken care of by std::string
//animal(const animal&)
//animal& operator=(const animal&)

void animal::SetName(const std::string& name)
{
 name_ = name;
}

查看 The Definitive C++ Book Guide and List 。我建议 加速C ++ 。它带有陡峭的学习曲线,但由于您已经了解了一些C ++,因此250页可能会让您走上正轨。

根据经验:每当你释放一个资源(内存或其他),并且它不是一个类的析构函数中的,其唯一目的是管理这一个资源,您的设计有问题。就个人而言,每当我觉得需要编写析构函数,复制构造函数或赋值运算符时,我就会产生怀疑。