删除向量中的指针会导致错误

Posted

技术标签:

【中文标题】删除向量中的指针会导致错误【英文标题】:deleting pointer in vector causes error 【发布时间】:2018-03-26 05:28:04 【问题描述】:

我一直在从事一个学校项目,在测试阶段,我们不断收到错误消息,同时想要删除(取消分配)任何内容。我们的类非常基础,不使用指针作为数据成员。管理这两个类之间交互的类使用指针向量来管理它们(在这种情况下更容易一些)。我们扫描了所有代码以查找双重删除或其他类似错误。 以下是可能导致错误的片段:

delete (nodes[i]);
nodes.erase(nodes.begin() + i);

节点是:

std::vector<Node*> nodes;

我不想给出整个代码,因为它非常大。 现在,从字面上看,任何删除操作都将不起作用,并导致程序崩溃:bad_module_info

谢谢

编辑:

这是一个例子:

int** matrix = new int*[nodes.size()];

for (unsigned int i = 0; i < nodes.size(); i++)
    matrix[i] = new int(nodes.size());




for (unsigned int i = 0; i < nodes.size(); i++)

    ref[i] = nodes[i]->getId();
    cout << ref[i];



//Setting up
for (unsigned int i = 0; i < edges.size(); i++)

    int from = edges[i]->getStartNode();
    int to = edges[i]->getEndNode();

    int indexRow = getRefrenceFromID(ref, nodes.size(), from);
    int indexCol = getRefrenceFromID(ref, nodes.size(), to);

    matrix[indexRow][indexCol] = 1;


//print the contents of the matrix
for (unsigned int i = 0; i < nodes.size(); i++)

    cout << ref[i] << "|"; //first print the ID of the row
    for (unsigned int j = 0; j < nodes.size(); j++) 
        cout << matrix[i][j];
    
    cout << endl;


for(unsigned int = 0; i < nodes.size();++i)
    delete[] matrix[i];

delete[] matrix;
delete[] ref;

【问题讨论】:

我不想给出整个代码,因为它太大了。 这是合适的。请通过minimal reproducible example 重现您的问题。否则,很难为您提供帮助。 你已经通过new int(nodes.size());创建了一个元素,使用new int[nodes.size()]; 这确实有效!感谢您的帮助。 【参考方案1】:

matrix[i] = new int(nodes.size()); 行是问题的根源。

new int(x); // Create a single int with value x
new int[x]; // Create array of x ints

看起来matrix[i] 应该是一个数组而不是单个 int,所以您应该使用 new int[nodes.size()];

更多关于new[] here的信息。

【讨论】:

以上是关于删除向量中的指针会导致错误的主要内容,如果未能解决你的问题,请参考以下文章

堆内存中的 C++ 向量导致分段错误

删除和删除与向量中的条件匹配的指针

如何删除对象指针向量中的指针和对象本身?

用于删除 Map 中的指针值和指针向量的 C++ 通用代码

为啥 void * 指向 gmock 中的 SetArgPointee 的指针会导致错误

在删除指向动态分配对象的指针向量中的元素之前,我需要做啥?