函数复制中的 C++ 双重错误
C++ double free error from function copy
我正在阅读 Stroustrup C++ 11 这本书,我 运行 遇到了双重释放异常。我知道它释放了两次内存,但我不明白的是为什么它发生在一个通过副本传递的函数中:
#include <iostream>
using namespace std;
namespace ALL_Vector {
class Vector {
public:
// Intitialize elem and sz before the actual function
Vector(int size) :elem {new double[size]}, sz {size} {};
~Vector() {delete[] elem;};
double& operator[](int i) {
return elem[i];
};
int size() {return sz;};
private:
double* elem;
int sz;
};
void print_product(Vector& y) {
double result {1};
for (auto x = 0; x < y.size() ; x++){
if (y[x] > 0) {result *= y[x]; };
}
cout << "The product of Vector y is: " << result << ", or so it would appear ;)\n";
}
}
/*
Self test of the Vector class.
*/
int main(){
ALL_Vector::Vector myVector(15);
cout << "The size of Vector y is: " << myVector.size() << "\n";
myVector[0] = 12;
myVector[2] = 7;
myVector[3] = 19;
myVector[4] = 2;
ALL_Vector::print_product(myVector);
return 0;
}
print_product() 正在获取 Vector class 并创建一个包含重复内容的新 Vector?为什么这会导致双重释放?我假设 RIIA 在这种情况下以某种方式与 Vector::~Vector() 交互,类似于竞争条件?
我知道如果我将其更改为通过引用传递它的参数,它将避免双重释放。我试图更好地理解传递副本的问题。
谢谢!
实际上你是在调用 print_product 并引用 myVector
,所以一切都很好。
麻烦从按值传递 myVector
开始,因为默认复制构造函数将复制 elem
指针而不是复制整个数组。
ALL_Vector::Vector
elem
指针将引用相同的内存存储,因此被删除两次。
为了解决这个问题,你必须实现复制构造函数来创建一个新数组并复制所有元素。
如果您为每个值传递 Vector
,则会调用复制构造函数,而不是您已实现的构造函数。
在这种情况下,elem
没有被复制,但指针被复制到新对象中,然后被析构函数删除了两次。
您必须实现一个分配新 elem
并复制所有元素的复制构造函数。
我正在阅读 Stroustrup C++ 11 这本书,我 运行 遇到了双重释放异常。我知道它释放了两次内存,但我不明白的是为什么它发生在一个通过副本传递的函数中:
#include <iostream>
using namespace std;
namespace ALL_Vector {
class Vector {
public:
// Intitialize elem and sz before the actual function
Vector(int size) :elem {new double[size]}, sz {size} {};
~Vector() {delete[] elem;};
double& operator[](int i) {
return elem[i];
};
int size() {return sz;};
private:
double* elem;
int sz;
};
void print_product(Vector& y) {
double result {1};
for (auto x = 0; x < y.size() ; x++){
if (y[x] > 0) {result *= y[x]; };
}
cout << "The product of Vector y is: " << result << ", or so it would appear ;)\n";
}
}
/*
Self test of the Vector class.
*/
int main(){
ALL_Vector::Vector myVector(15);
cout << "The size of Vector y is: " << myVector.size() << "\n";
myVector[0] = 12;
myVector[2] = 7;
myVector[3] = 19;
myVector[4] = 2;
ALL_Vector::print_product(myVector);
return 0;
}
print_product() 正在获取 Vector class 并创建一个包含重复内容的新 Vector?为什么这会导致双重释放?我假设 RIIA 在这种情况下以某种方式与 Vector::~Vector() 交互,类似于竞争条件?
我知道如果我将其更改为通过引用传递它的参数,它将避免双重释放。我试图更好地理解传递副本的问题。
谢谢!
实际上你是在调用 print_product 并引用 myVector
,所以一切都很好。
麻烦从按值传递 myVector
开始,因为默认复制构造函数将复制 elem
指针而不是复制整个数组。
ALL_Vector::Vector
elem
指针将引用相同的内存存储,因此被删除两次。
为了解决这个问题,你必须实现复制构造函数来创建一个新数组并复制所有元素。
如果您为每个值传递 Vector
,则会调用复制构造函数,而不是您已实现的构造函数。
在这种情况下,elem
没有被复制,但指针被复制到新对象中,然后被析构函数删除了两次。
您必须实现一个分配新 elem
并复制所有元素的复制构造函数。