我有一个包含多个数组的类,这些数组的大小可以由其构造函数的参数确定。我的问题是此类的实例的大小无法在编译时确定,而且我不知道如何在运行时告诉 new 方法我需要我的对象有多大.每个对象将具有固定大小,但不同的实例可能具有不同的大小。
有几种方法可以解决这个问题:
- 使用工厂
- 使用放置构造函数
- 在构造函数中分配数组并将指向它们的指针存储在我的对象中。
我正在改编用 C 编写的旧应用程序中的一些遗留代码。在原始代码中,程序计算出整个对象需要多少内存,为此调用 malloc()
,然后继续初始化各个字段。
对于 C++ 版本,我希望能够为我的对象制作一个(相当)普通的构造函数。它将是父类的后代,一些代码将依赖于多态性来调用正确的方法。来自同一父级的其他类的大小在编译时已知,因此不会出现问题。
我想在使用placement new 时避免一些必要的特殊注意事项,并且我希望能够以正常方式删除对象。
我想避免在我的对象体内携带指针,部分是为了避免与复制对象相关的所有权问题,部分是因为我想尽可能多地重用现有的 C 代码。如果所有权是唯一的问题,我可能可以只使用共享指针而不用担心。
这是创建对象的 C 代码的精简版本:
typedef struct
{
int controls;
int coords;
} myobject;
myobject* create_obj(int controls, int coords)
{
size_t size = sizeof(myobject) + (controls + coords*2) * sizeof(double);
char* mem = malloc(size);
myobject* p = (myobject *) mem;
p->controls = controls;
p->coords = coords;
return p;
}
对象内的数组保持对象生命周期的固定大小。在上面的代码中,myobject
结构之后的内存将用于保存数组元素。
我觉得我可能遗漏了一些明显的东西。有没有什么方法我不知道如何用 C++ 编写一个(相当)普通的构造函数,但能够告诉它对象在运行时需要多少内存,而无需求助于“放置新”方案?
最佳答案
实用的方法如何:保持结构不变(如果与 C 的兼容性很重要)并将其包装到 C++ 类中?
typedef struct
{
int controls;
int coords;
} myobject;
myobject* create_obj(int controls, int coords);
void dispose_obj(myobject* obj);
class MyObject
{
public:
MyObject(int controls, int coords) {_data = create_obj(controls, coords);}
~MyObject() {dispose_obj(_data);}
const myobject* data() const
{
return _data;
}
myobject* data()
{
return _data;
}
int controls() const {return _data->controls;}
int coords() const {return _data->coords;}
double* array() { return (double*)(_data+1); }
private:
myobject* _data;
}
关于c++ - 使用构造函数分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36318498/