Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否需要删除动态结构内容,然后删除结构本身?_C++_Memory Management - Fatal编程技术网

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

C++ 是否需要删除动态结构内容,然后删除结构本身?,c++,memory-management,C++,Memory Management,我的问题是是否有必要删除bread->name,或者删除bread是否能帮我解决这个问题。如果有必要删除bread->name,为什么在我尝试这样做时程序会崩溃?问题实际上源于此: *** Error in `./out': munmap_chunk(): invalid pointer: 0x0000000000400824 *** 为名称分配一个新数组后,您将该指针分配给一个完全不同的值—一个恰好位于只读内存中的值。因此,删除它时会出现错误:您试图删除[]未分配的数组 关键问题是,您不希望

我的问题是是否有必要删除bread->name,或者删除bread是否能帮我解决这个问题。如果有必要删除bread->name,为什么在我尝试这样做时程序会崩溃?

问题实际上源于此:

*** 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;
}