Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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++ 在extra函数中使用delete/new时堆损坏_C++_Operator Overloading_Heap_New Operator_Delete Operator - Fatal编程技术网

C++ 在extra函数中使用delete/new时堆损坏

C++ 在extra函数中使用delete/new时堆损坏,c++,operator-overloading,heap,new-operator,delete-operator,C++,Operator Overloading,Heap,New Operator,Delete Operator,在下面的代码示例中,VisualStudio给出了错误“堆已损坏”。起初for循环似乎工作得很好,但经过1到2次迭代后,它就崩溃了 我觉得我的函数myreallocation会在不应该的地方导致某种内存泄漏(因为当我注释掉它时,一切都正常)。到底发生了什么?这似乎是一个非常微妙的错误 #include <iostream> using namespace std; class myClass{}; void myReAllocate(myClass* c) { delet

在下面的代码示例中,VisualStudio给出了错误“堆已损坏”。起初for循环似乎工作得很好,但经过1到2次迭代后,它就崩溃了

我觉得我的函数
myreallocation
会在不应该的地方导致某种内存泄漏(因为当我注释掉它时,一切都正常)。到底发生了什么?这似乎是一个非常微妙的错误

#include <iostream>
using namespace std;

class myClass{};

void myReAllocate(myClass* c)
{
    delete c;
    c = new myClass();
}

int main(void)
{
    myClass *cc[10];

    for (int i = 0; i < 10; i++){
        cout << i << " attempt" << endl;
        cc[i] = new myClass();
        myReAllocate(cc[i]);
        delete cc[i];
    }

    return 0;
}

myReAllocate
获取myClass的地址作为参数。然后释放该地址,分配一个新对象,并将其分配给局部变量。这对
cc[i]
的值没有影响。因此,当您删除cc[i]时,您将再次删除已删除的对象

如果您希望执行类似操作,则需要传递cc[i](或对其的引用)的地址,以便您可以更改它:

void myReAllocate(myClass** c)
{
    delete *c;
    *c = new myClass();
}

myReAllocate
获取myClass的地址作为参数。然后释放该地址,分配一个新对象,并将其分配给局部变量。这对
cc[i]
的值没有影响。因此,当您删除cc[i]时,您将再次删除已删除的对象

如果您希望执行类似操作,则需要传递cc[i](或对其的引用)的地址,以便您可以更改它:

void myReAllocate(myClass** c)
{
    delete *c;
    *c = new myClass();
}

我会选择引用而不是指针作为参数:

void myReAllocate(myClass*& c)
{
    delete c;
    c = new myClass();
}
因为这不需要更改客户端代码。Goswin的提案要求myReAllocate的要求是:

myReAllocate(&cc[i]);

而引用允许在不做任何更改的情况下调用它。

我会选择引用而不是指针作为参数:

void myReAllocate(myClass*& c)
{
    delete c;
    c = new myClass();
}
因为这不需要更改客户端代码。Goswin的提案要求myReAllocate的要求是:

myReAllocate(&cc[i]);

而引用允许在不做任何更改的情况下调用它。

您的新函数可以正常工作。谢谢但是为什么
*c
是本地的呢?它不是指向
cc[i]
?这不是我所需要的吗?为什么一个简单的
void myreallocation(myClass*c){delete c;*c=*(new myClass());}
不起作用呢?因为在下一条指令中,您在为c赋值时删除了c。写入已被释放的内存。您还分配了一个从未释放过的对象,该对象会导致内存泄漏。如果你想(而且你真的应该)使用asignment,那么删除delete和new并只执行asignment。你所说的只使用赋值是什么意思?
cc[i]=myClass()还有std::vector,但我假设您正在学习指针,因此这可能不利于练习。您的新函数可以工作。谢谢但是为什么
*c
是本地的呢?它不是指向
cc[i]
?这不是我所需要的吗?为什么一个简单的
void myreallocation(myClass*c){delete c;*c=*(new myClass());}
不起作用呢?因为在下一条指令中,您在为c赋值时删除了c。写入已被释放的内存。您还分配了一个从未释放过的对象,该对象会导致内存泄漏。如果你想(而且你真的应该)使用asignment,那么删除delete和new并只执行asignment。你所说的只使用赋值是什么意思?
cc[i]=myClass()还有std::vector,但我假设您正在学习指针,因此这可能不利于练习。