我在很多地方读到,在 C++ 中,不能使用 new[] 运算符来创建没有默认构造函数的对象数组。我也明白我可以使用 vector 来轻松实现这一点。
但是,我尝试了以下代码,它似乎使我能够在没有默认构造函数的情况下对对象数组使用 new[] 运算符:
struct mystuff{
int data1, data2;
mystuff(int a){
data1 = a;
data2 = 10;
}
mystuff(int a, int g){
data1 = a;
data2 = g;
}
};
int main(){
mystuff *b = static_cast<mystuff*> (::operator new (sizeof(mystuff[5]))); //allocate memory
for (int i = 0; i < 5; i++){
std::cout << &b[i] << std::endl; //addresses of allocated memory
}
new (b + 1)mystuff(5); //initialize one of the values in the array with non default constructor
new (b + 3)mystuff(10, 15); //initialize one of the values in the array with non default constructor
std::cout << "\n" << std::endl;
for (int i = 0; i < 5; i++){
std::cout << &b[i] << std::endl; //addresses of allocated memory after constructor
}
std::cout << "Values of constructed objects" << std::endl;
std::cout << b[1].data1 << "," << b[1].data2 << std::endl;
std::cout << b[3].data1 << "," << b[3].data2 << std::endl;
std::cin.get();
delete[] b;
return 0;
}
如果有人能告诉我这是否是合法的事情,或者显示的内容是否因我没有意识到的某种原因而非常错误和危险(即我以某种方式在这个特定的地方创建了内存泄漏),我将不胜感激。示例)。
非常感谢
最佳答案
您可以为动态数组提供初始值设定项,也可以填充 vector :
mystuff * b = new mystuff[3] { mystuff(1), mystuff(2, 3), mystuff(4) };
// *b is leaked
std::vector<mystuff> const c { mystuff(1), mystuff(2, 3), mystuff(4) };
关于c++ - 创建没有默认构造函数的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26497811/