是否需要删除动态结构内容,然后删除结构本身?

Ian*_*ing 1 c++ memory-management

#include <cstring>
using namespace std;

struct Product {
   char *     name;
   float      price;
};

int main() {
    Product * bread = new Product;
    bread->name = new char[6];
    bread->name = "bread";

    delete[] bread->name; //!!!THE ERROR OCCURS ON THIS LINE!!!
    delete bread;
}
Run Code Online (Sandbox Code Playgroud)

给我以下错误:

*** Error in `./out': munmap_chunk(): invalid pointer: 0x0000000000400824 ***
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否有必要删除面包 - >名称,或者删除面包将为我处理.如果有必要删除bread-> name,为什么程序在我尝试时会崩溃?

Bar*_*rry 8

问题实际上源于此:

bread->name = "bread";
Run Code Online (Sandbox Code Playgroud)

在为一个新数组分配之后name,您将该指针分配给一个完全不同的值 - 一个恰好存在于只读内存中的值.因此,当您删除它时出现错误:您正在尝试delete []使用未分配的数组.

关键问题是你不想分配指针 name,你想填充刚分配的数组的内容 - 你想填充name 指向的内容.为此,strcpy:

strcpy(bread->name, "bread");
Run Code Online (Sandbox Code Playgroud)

或者真的,因为这是C++:

struct Product {
   std::string  name;
   float        price;
};

Product bread;
bread.name = "bread";
Run Code Online (Sandbox Code Playgroud)