C++ 中对象数组的内存分配和初始化

问题描述 投票:0回答:1

我刚刚开始学习c++。我需要实现一个函数,该函数分配 N 个对象的数组,使用作为参数传递的名称对其进行初始化,并返回指向该数组的指针。

**该项目的限制:禁止使用 C++11(及其派生形式)和 Boost 库。以下函数也被禁止:printf()、alloc() 和 free()。没有容器(矢量/列表/地图/等等)。

这是我的代码:

class MyClass {
    private:
        std::string _name;
    public:
        MyClass () {std::cout << "***Object " << _name << " constructed with default constructor***\n";};
        MyClass(std::string name) : _name(name) {std::cout << "***Object " << _name << " constructed with my constructor***\n";};
        ~MyClass() {std::cout << "***Object " << _name << " destructed***\n";};
};

    MyClass* classArr (int N, std::string name) {
      MyClass *arr = new MyClass[N];
      for (int i = 0; i < N; i++)
      {
        new (&arr[i]) MyClass(name);
        //arr[i] = MyClass(name);
      }

      return (arr);
}

int main()
{
    MyClass *arr = classArr(3, "X");
    delete[] arr;
}

这样做有效吗?打印语句显示创建了 3 个具有默认构造函数的对象。然后用我的构造函数在内存的同一位置创建 3 个对象,并用名称初始化,然后 3 个对象被销毁。前 3 个会发生什么?我使用了两次new,我分配了多少内存?如果我用 arr[i] = MyClass(name); 取消注释该行而不是新的放置,会发生什么?也许这是非常基本的,但我真的不明白那里发生了什么。

c++ class constructor new-operator
1个回答
0
投票

这样做有效吗?

不。 具体是这个。

  MyClass *arr = new MyClass[N];
  for (int i = 0; i < N; i++)
  {
    new (&arr[i]) MyClass(name);
    //arr[i] = MyClass(name);
  }
对于高级 C++ 程序员来说,

Placement new 是一项不寻常的语言功能。 绝不能将您正在执行的现有对象的地址传递给它。

这会导致未定义的行为。

© www.soinside.com 2019 - 2024. All rights reserved.