c++ - 使用构造函数分配内存

标签 c++ constructor

我有一个包含多个数组的类,这些数组的大小可以由其构造函数的参数确定。我的问题是此类的实例的大小无法在编译时确定,而且我不知道如何在运行时告诉 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/

相关文章:

C++从套接字读取未知数量的数据

c++ - 指针和左移运算符的引用

c++ - 为什么在这种情况下 memset 会失败?

c++ - 需要 std::unordered_map 构造函数的示例

java - 你把 super() 调用放在构造函数的开头吗?

c++ - 优化数学表达式

c++ - 如何在boost中遍历图使用BFS

c++ - 引用构造函数

c++ - 如何在模板类中使用唯一指针深度复制构造函数?

c++ - 从另一个类调用构造函数