Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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++_C++11 - Fatal编程技术网

C++ 如何正确地从动态内存中删除对象指针?

C++ 如何正确地从动态内存中删除对象指针?,c++,c++11,C++,C++11,我有一个方法,当给出一个命令时,删除存储在向量中的所有对象指针。这些指针都是使用new命令在堆上创建的。这就是我的方法,我得到了分割错误11错误 else if (command == "Clear") { size_t allGrades = grades.size(); for (size_t i = 0; i < allGrades; ++i) { grades[0] = nullptr; delete grades[0]; }

我有一个方法,当给出一个命令时,删除存储在向量中的所有对象指针。这些指针都是使用
new
命令在堆上创建的。这就是我的方法,我得到了分割错误11错误

else if (command == "Clear") {
    size_t allGrades = grades.size();
    for (size_t i = 0; i < allGrades; ++i) {
        grades[0] = nullptr;
        delete grades[0];
    }
}
else if(命令==“清除”){
size_t allGrades=grades.size();
对于(尺寸i=0;i<所有等级;++i){
等级[0]=nullptr;
删除等级[0];
}
}
其中
grades
是堆上已分配的指针向量。我该如何解决这个问题

    grades[0] = nullptr;
    delete grades[0];
一定是

    delete grades[i];
    grades[i] = nullptr;
否则,您不会删除保存在
grades
中的元素(在删除之前设置为0,并且始终查看grades中的第一个元素),因此会造成内存泄漏

{编辑添加} “这些指针都是使用new命令在堆上创建的”:使用new命令无法将分配的内存放入堆栈中

一定是

    delete grades[i];
    grades[i] = nullptr;
否则,您不会删除保存在
grades
中的元素(在删除之前设置为0,并且始终查看grades中的第一个元素),因此会造成内存泄漏

{编辑添加}
“这些指针都是使用new命令在堆上创建的”:使用new命令,分配的内存不能放入堆栈中

解决这个问题的简单方法是不要拥有原始指针。很可能*你不需要
new
grade对象,然后将指针存储在向量中

std::vector
更改为
std::vector
,您的代码片段将变为

else if (command == "Clear") {
    grades.clear();
}

*如果确实需要动态分配
等级
对象,则应使用
std::vector
,并使用
std::make_unique
而不是
new
构建它们。清除与值大小写相同。

解决此问题的简单方法是不拥有原始指针。很可能*你不需要
new
grade对象,然后将指针存储在向量中

std::vector
更改为
std::vector
,您的代码片段将变为

else if (command == "Clear") {
    grades.clear();
}

*如果确实需要动态分配
等级
对象,则应使用
std::vector
,并使用
std::make_unique
而不是
new
构建它们。清算与价值案例相同。

您的代码应为
删除等级[i];等级[i]=零PTR但这并不是导致崩溃的原因。该bug位于代码的其余部分。你真的应该发布一个完整的程序,初学者通常认为这个bug不是真的is@Simon:我们需要更多的代码来查看发生了什么。目前,尝试使用
std::unique_ptr
而不是您拥有所有权的原始指针来学习使用,并在您的下一个问题中提供一些您需要提供的信息。如图所示,您的代码不会崩溃,尽管它会导致
grades[0]
(如果不是null)的原始值泄漏。很可能是程序中的其他代码导致了问题。一般来说,未定义的行为通常表现为代码中的症状,与问题的实际原因完全无关(尽管人们坚持“不,崩溃在这里,所以原因在这里”),那么您的代码应该阅读
delete grades[i];等级[i]=零PTR但这并不是导致崩溃的原因。该bug位于代码的其余部分。你真的应该发布一个完整的程序,初学者通常认为这个bug不是真的is@Simon:我们需要更多的代码来查看发生了什么。目前,尝试使用
std::unique_ptr
而不是您拥有所有权的原始指针来学习使用,并在您的下一个问题中提供一些您需要提供的信息。如图所示,您的代码不会崩溃,尽管它会导致
grades[0]
(如果不是null)的原始值泄漏。很可能是程序中的其他代码导致了问题。一般来说,未定义的行为通常表现为代码中的症状,与问题的实际原因完全无关(尽管人们坚持“不,崩溃在这里,所以原因在这里”)是的,但发布的代码基本上是不可操作的,因此,老年退休金计划的崩溃在别处,但把所有这些都说成一句话是不太实际的。是的,但发布的代码基本上是一句不可行的话,所以老年退休金计划的崩溃在别处,但把所有这些都说成一句话是不太实际的。