超出范围时,对象会被解构

时间:2014-04-14 11:31:55

标签: c++

我有一个类,它有一个对象数组作为它的实例变量。每个对象内部都包含intstruct。但不知何故,对象被解构了。

class AllInput {
public:
    int numProducts;
    Product * products;

public:
    AllInput(int _numProducts, Product * _products);
};

class Product {
public:
    int sellingPrice; //Ri
    struct DemandDistribution observationDemand; //C2i

public:
    Product(
            LucyDecimal _sellingPrice, //Ri
            LucyDecimal _costPriceAssmbly);
};

然后我有一个创建它的函数:

AllInput* in1() {
    struct DemandDistribution * _observationDemand1 =
            (DemandDistribution*) malloc(sizeof(DemandDistribution));
    // set values
    Product * product1 = new Product(165,_observationDemand1);
    //initialize product2, product3, product4 
    Product  products[4] = { *product1, * product2,  *product3, *product4};
    AllInput* all = new AllInput(4, products);
    return all;
}

当我做AllInput* in = in1()时。一旦执行,我就会看到4个中的每个产品都被解构(感谢产品的解构器中的print语句)。我遗失了什么?

PS:我需要使用指针而不是引用,因为我需要将其复制到cuda内存。

1 个答案:

答案 0 :(得分:6)

你在堆栈上声明了Product products[4],所以当它扩展时会被释放(离开函数)

Product  products[4] = { *product1, * product2,  *product3, *product4};
AllInput* all = new AllInput(4, products);

构建动态分配的AllInput时,如果您不将产品复制到AllInputs的内部成员中,则在离开函数in1时,products将被释放保存在AllInput中的指针将指向垃圾。

因此,也要为products创建动态分配,或者复制AllInput中的所有数据(指针数组)。