int main() {
Product * bread = new Product;
bread->name = new char[6];
bread->name = "bread"; // <- Error! Overwriting the pointer value!
delete[] bread->name; // <- Error! Trying to free read-only memory where "bread" is stored...
delete bread;
}
基本上你覆盖的动态分配的字符数组new char[6]
与"bread"
恒定的字符数组。删除动态分配,您不必删除它。
当您编写"bread"
时,编译器将采用这些字母并将它们存储在只读存储器中。每次写入"bread"
并尝试分配它时,您都有效地将指针分配给只读内存或const char*
。
当你分配你的动态数组,你保存在bread->name
指针动态分配的内存的地址,但你与你不允许释放只读存储器的地址改写它。因此,编译器正在抱怨。
在您的代码中,由于您不再具有指向动态分配内存的指针,因此您不能再释放它,并且还会发生内存泄漏。
我会做这样的(假设您在使用字符串限制),并假设你真正想要的动态分配:
int main() {
const char* breadStr = "bread";
int len = strlen(breadStr);
Product * bread = new Product;
bread->name = new char[len + 1];
strncpy(bread->name, breadStr, len + 1); // Copy the string and the \0 (hence the +1)
delete[] bread->name; // no more error!
delete bread;
}
如果不需要动态分配的,那么你可以做这样的事情:
int main() {
Product * bread = new Product;
bread->name = "bread";
// You don't have to delete the bread->name since it is NOT dynamically allocated but is in your read-only memory.
delete bread;
}
但我真的更喜欢用@Barry建议的字符串在C++中完成所有这些。
只是FYI:我只使用char数组,因为这个类的教授不允许我们使用字符串。 –