我已经在许多地方读过,在c ++中你不能使用new []运算符来创建没有默认构造函数的对象数组。我也明白我可以使用向量轻松实现这一点。
但是,我尝试了以下代码,这似乎使我能够使用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;
}
如果有人能告诉我这是否合法,或者显示的内容是非常错误和危险因为某些我没有意识到的原因(即我在某种程度上造成内存泄漏),我将不胜感激例子)。
非常感谢
答案 0 :(得分:2)
您可以为动态数组提供初始值设定项,也可以填充向量:
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) };
答案 1 :(得分:2)
您要做的事情基本上与std::vector
在其内部所做的相同。
实际上,您的代码不合法。首先,对于使用展示位置new
创建的对象,您必须手动调用析构函数:
b[1].~mystuff();
b[3].~mystuff();
第二,delete[] b
是非法的,因为它要求的内存未分配new[]
,因此您有未定义的行为。因此,您应该将其替换为::operator delete(b);
或::operator delete(b, sizeof(mystuff[5])));
。