Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/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++_Pointers_Vector - Fatal编程技术网

C++ 如何删除向量的指针

C++ 如何删除向量的指针,c++,pointers,vector,C++,Pointers,Vector,我想正确地删除向量的所有元素。我需要按照下面应该看到的方式填充结构向量向量,每次调用new方法创建一个新的结构向量 这是我的代码: struct node { int index; double value; } struct problem { int l; struct node **x; }; struct problem prob; // set by read_problem std::vector<node *> vettProb

我想正确地删除向量的所有元素。我需要按照下面应该看到的方式填充结构向量向量,每次调用
new
方法创建一个新的结构向量

这是我的代码:

struct node
{
    int index;
    double value;
}

struct problem
{
    int l;
    struct node **x;
};

struct problem prob;    // set by read_problem
std::vector<node *> vettProbX;


int main(){
    node tmpValue;
    std::vector <node> *temp;

    for (int i=0; i<10; i++)
    {
        temp = new std::vector<node>;

        for (int i=0; i<10; i++)
        {
            tmpValue.index=i;
            tmpValue.value=i;
            temp->push_back(tmpValue);
        }

        vettProbX.push_back(temp->data());

    }

    prob.x=&vettProbX[0];

    //Destructor
    for(int CC=0; CC<vettProbX.size(); CC++)
    {
        delete  temp[CC];
    }
    return 0;
}
struct节点
{
整数指数;
双重价值;
}
结构问题
{
int l;
结构节点**x;
};
结构问题prob;//由read_问题设置
std::向量vettProbX;
int main(){
节点tmpValue;
标准::向量*温度;
对于(int i=0;idata());
}
prob.x=&vettProbX[0];
//析构函数

对于(int CC=0;CC而言,您为new分配的唯一对象是
std::vector*temp;
。 您可以使用
delete temp;
Vectors own析构函数来删除它。但每次调用new时都必须这样做。在这种情况下,您需要在循环结束时调用delete

但由于
temp
仅在作用域内使用,因此不需要动态分配。您可以在堆栈上这样分配它:
std::vector temp;
。然后,当它超出作用域时(在本例中的函数结束时),它将自动销毁

在您的代码中,您分配了10次temp,但您泄漏了前9次,因为您没有将其指针存储在任何位置(因此无法再删除它们)。您总是覆盖上一个temp的指针。在代码末尾,您尝试删除上一个temp的内容(您不能删除,因为内容不是指针)而不是向量本身

要实现您想要做的事情,您需要做的是将所有临时指针存储在
std::vector
中,并最终删除其中的每个向量。但是如果您根本不使用任何指针,您的代码会更好


另外,您有两个使用相同循环变量的嵌套循环。它可能无法按照您的预期工作。

唯一分配了new的对象是
std::vector*temp;
。 您可以使用
delete temp;
Vectors own析构函数来删除它。但每次调用new时都必须这样做。在这种情况下,您需要在循环结束时调用delete

但由于
temp
仅在作用域内使用,因此不需要动态分配。您可以在堆栈上这样分配它:
std::vector temp;
。然后,当它超出作用域时(在本例中的函数结束时),它将自动销毁

在您的代码中,您分配了10次temp,但您泄漏了前9次,因为您没有将其指针存储在任何位置(因此无法再删除它们)。您总是覆盖上一个temp的指针。在代码末尾,您尝试删除上一个temp的内容(您不能删除,因为内容不是指针)而不是向量本身

要实现您想要做的事情,您需要做的是将所有临时指针存储在
std::vector
中,并最终删除其中的每个向量。但是如果您根本不使用任何指针,您的代码会更好

另外,您有两个嵌套循环,它们使用相同的循环变量。它可能无法按预期工作

我想正确地删除向量的所有元素

由于分配内存的方式很奇怪,所以不可能释放所有内容。您可以动态分配一个由
temp
指向的向量,然后在循环的下一次迭代中覆盖指向它的指针。也就是说,一旦指针的记录消失,您就无法释放它

我需要填充结构向量的向量

在这种情况下,您应该首先创建一个
向量
。如果没有向量,并且当前代码没有向量,则无法填充向量向量

我想正确地删除向量的所有元素

由于分配内存的方式很奇怪,所以不可能释放所有内容。您可以动态分配一个由
temp
指向的向量,然后在循环的下一次迭代中覆盖指向它的指针。也就是说,一旦指针的记录消失,您就无法释放它

我需要填充结构向量的向量


在这种情况下,您应该首先创建一个
向量。
。如果没有向量,则无法填充向量向量,并且当前代码也没有向量。

如果没有保存指向新创建向量的指针,则在此处创建:

temp = new std::vector<node>;
如果您需要访问这些内存段而不是

vettProbX[i]
您必须调用
data
方法

vettProbX[i]->data()

如果不保存指向新创建的向量的指针,请在此处创建:

temp = new std::vector<node>;
如果您需要访问这些内存段而不是

vettProbX[i]
您必须调用
data
方法

vettProbX[i]->data()

将指针存储在:,它将为您处理删除。我不太了解您的代码,但我理解您的问题的方式可能会对您有所帮助(只需将BinaryTree替换为std::vector)。你想做什么?
temp=new std::vector;
这一行看起来是内存泄漏的好地方。确保在i循环结束时删除temp。将指针存储在:,它将为你处理删除操作。我不太明白你的代码,但我理解你的问题的方式可能对你有所帮助(只需将二进制树替换为std::vector)。你想做什么?
temp=new std::vector;
这一行看起来像是内存泄漏的好地方。请确保在i循环结束时删除temp。这只是我完整代码的主要内容。无论如何,我需要为其他目的手动分配它。@user2988113,还有什么其他用途?我需要在每次迭代,一个指向不同内存段的指针。问题是如何正确删除所有创建的指针