使用内存复制对象数组
Using memcpy to copy an array of objects
最近我在我的项目中遇到了错误的双重自由或腐败错误。经过一些测试运行后,问题被确定为使用memcpy的复制函数。
class Pen
{ string make;
string model;
string color;
public:
Pen();
}
class A
{ private:
Pen* array; //an array that stores pen objects
int NumOfItem;
int Maxsize;
void CopyArray(const A& source);
public:
A();
A(const A& source);//copy constructor where uses the CopyArray private mentioned below
~A();
}
void A::CopyArray(const A& source)
{
memcpy(array, source.array, len * sizeof(Pen));//
return;
}
void A::A(const A& source)//copy constructor that performs a deep copy from B
{ array = new Pen[source.NumOfItem];
NumOfItem = source.NumOfItem;
MaxisIze=source.Maxize;
CopyArray(source);
}
当我修改代码并使用for循环复制每个参数时,它可以工作。我仍然试图理解为什么内存会导致问题,如果它所做的只是将所有数据按位复制到新对象......(抱歉,格式有点乱…)
使用memcpy
的问题是它绕过了复制构造函数。只有当你的类由原语组成时,这才可以。
然而,Pen
类具有std::string
类型的非原语数据成员。这些对象需要调用复制构造函数进行复制。memcpy
不执行任何复制构造函数的调用,这导致std::string
的内部表示被共享,这反过来导致销毁时的未定义行为。
c++标准库提供了一个用于复制范围的实用函数std::copy
。使用这个函数可以避免您看到的问题,因为它可以根据需要调用复制构造函数。
您只能使用memcpy()
来复制一般可复制的对象。让我们看看Pen
是否满足这个要求。
#include <string>
using namespace std;
class Pen {
string make;
string model;
string color;
public:
Pen();
};
static_assert(std::is_trivially_copyable<Pen>::value, "Pen is not trivially copyable");
当编译时,这将返回错误:
blah.cc:12:1: error: static_assert failed "Pen is not trivially copyable"
static_assert(std::is_trivially_copyable<Pen>::value, "Pen is not trivially copyable");
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
所以,我们可以清楚地看到,Pen
不是平凡的可复制的,所以我们不能使用memcpy()
与它。您可能应该使用std::copy
。
相关文章:
- 将对象数组的引用传递给函数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 类对象数组的问题会导致崩溃
- Arduino C++在构造函数中用参数声明对象数组
- 使用对象数组对 SFML 进行动画处理
- C++ 对象数组堆栈溢出
- 如何将对象数组作为参数传递给模板
- 使用向量初始化参数化构造函数的对象数组
- 如何初始化对象数组?
- C++创建对象数组
- 在对象数组中搜索字符串并返回相应值的函数
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 如何在运行时在对象数组中动态追加新对象C++并打印它们
- 为什么我在声明对象数组时不能使用 -> 运算符?
- 编译时生成应在构造函数中创建的非 constexpr 对象数组
- 使用 C++ 创建对象数组
- 对象数组打印空白字符串
- 重载运算符 [] 用于从对象数组中给出特定索引
- 如何在 C++ 中使用提升属性树从 JSON 文件中读取对象数组