C++ 是否需要删除动态结构内容,然后删除结构本身?
我的问题是是否有必要删除bread->name,或者删除bread是否能帮我解决这个问题。如果有必要删除bread->name,为什么在我尝试这样做时程序会崩溃?问题实际上源于此:C++ 是否需要删除动态结构内容,然后删除结构本身?,c++,memory-management,C++,Memory Management,我的问题是是否有必要删除bread->name,或者删除bread是否能帮我解决这个问题。如果有必要删除bread->name,为什么在我尝试这样做时程序会崩溃?问题实际上源于此: *** Error in `./out': munmap_chunk(): invalid pointer: 0x0000000000400824 *** 为名称分配一个新数组后,您将该指针分配给一个完全不同的值—一个恰好位于只读内存中的值。因此,删除它时会出现错误:您试图删除[]未分配的数组 关键问题是,您不希望
*** Error in `./out': munmap_chunk(): invalid pointer: 0x0000000000400824 ***
为名称
分配一个新数组后,您将该指针分配给一个完全不同的值—一个恰好位于只读内存中的值。因此,删除它时会出现错误:您试图删除[]
未分配的数组
关键问题是,您不希望分配指针名称
,而是希望填充刚刚分配的数组的内容-您希望填充名称
指向的内容。为此:
或者说真的,因为这是C++:
strcpy(bread->name, "bread");
问题实际上源于此:
*** Error in `./out': munmap_chunk(): invalid pointer: 0x0000000000400824 ***
为名称
分配一个新数组后,您将该指针分配给一个完全不同的值—一个恰好位于只读内存中的值。因此,删除它时会出现错误:您试图删除[]
未分配的数组
关键问题是,您不希望分配指针名称
,而是希望填充刚刚分配的数组的内容-您希望填充名称
指向的内容。为此:
或者说真的,因为这是C++:
strcpy(bread->name, "bread");
如果不需要动态分配,则可以执行以下操作:
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;
}
<>但是我更喜欢用C++来做这一切,比如说“巴里建议”。 如果不需要动态分配,则可以执行以下操作:
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;
}
<>但我更喜欢用C++来做这类的所有操作,比如@巴里建议。只是FIY:我只使用字符数组,因为这个类的教授不允许我们使用字符串。FIY:我只使用字符数组,因为这个类的教授不允许我们使用字符串。“但是我更喜欢用C++来做所有这些,比如说”巴里建议。“我也是!谢谢你的帮助!”但是我真的喜欢用C++来做所有这些,比如说“巴里建议”。我也是!谢谢你的帮助!
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;
}