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

时间:2019-01-01 09:28:35

标签: 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];
    }
}

其中grades是已在堆上分配的指针的向量。我该如何解决?

2 个答案:

答案 0 :(得分:2)

text_file = open('training.txt', 'r')
file = text_file.readlines()
s = []
for line in file:
    s.append(re.findall(r'\!*\.*\d+', line))

print(s)

必须

The Da Vinci Code book is just awesome 1
this was the first clive cussler i've ever read, but even books like Relic, and Da Vinci code were more plausible than this 1
i liked the Da Vinci Code a lot 1
da vinci code was an awesome movie 1 
mission impossible 2 rocks 1

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

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

答案 1 :(得分:1)

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

std::vector<Grade *>更改为std::vector<Grade>,您的代码段将变为

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

*如果确实需要动态分配Grade对象,则应使用std::vector<std::unique_ptr<Grade>>,并使用std::make_unique而非new来构造它们。清算与有价交易无异。