创建没有默认构造函数的对象数组

时间:2014-10-21 23:01:01

标签: c++ new-operator dynamic-arrays

我已经在许多地方读过,在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;
}

如果有人能告诉我这是否合法,或者显示的内容是非常错误和危险因为某些我没有意识到的原因(即我在某种程度上造成内存泄漏),我将不胜感激例子)。

非常感谢

2 个答案:

答案 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])));