我刚刚开始学习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); 取消注释该行而不是新的放置,会发生什么?也许这是非常基本的,但我真的不明白那里发生了什么。
这样做有效吗?
不。 具体是这个。
MyClass *arr = new MyClass[N];
for (int i = 0; i < N; i++)
{
new (&arr[i]) MyClass(name);
//arr[i] = MyClass(name);
}
对于高级 C++ 程序员来说,Placement new 是一项不寻常的语言功能。 绝不能将您正在执行的现有对象的地址传递给它。
这会导致未定义的行为。