所以我决定在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 ptrName
和delete [] ptrName
,但无济于事。
animal * cat = new animal("Optimus Prime");
delete cat;
我错过了什么?
答案 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页可能会让您走上正轨。
根据经验:每当你释放一个资源(内存或其他),并且它不是一个类的析构函数中的,其唯一目的是管理这一个资源,您的设计有问题。就个人而言,每当我觉得需要编写析构函数,复制构造函数或赋值运算符时,我就会产生怀疑。