保持对象在C ++中持久存在?

时间:2016-07-12 08:20:27

标签: c++ memory-management segmentation-fault shared-ptr shared-memory

以下是我尝试创建Minimal, Complete, and Verifiable example

的代码
#include <stdio.h>
#include <cstdlib>
#include <iostream>
#include <vector>

using namespace std;

class ObjectHoldingData {
public:
    ObjectHoldingData(int item);
    int item;
};

ObjectHoldingData::ObjectHoldingData (int item) {
    this->item = item;
}

vector<ObjectHoldingData*> listOfObjectsWithData;

class ObjectGenerator {
public: 
    ObjectGenerator(int counter);
    void run();
    int counter;
};

ObjectGenerator::ObjectGenerator (int counter) {
    this->counter = counter;
}

void ObjectGenerator::run () {
    ObjectHoldingData *obj = new ObjectHoldingData(counter);

    listOfObjectsWithData.push_back(obj);

    for (unsigned int i = 0; i < listOfObjectsWithData.size(); ++i) {
        ObjectHoldingData *currObj = listOfObjectsWithData.at(i);
        cout << "Object " << currObj->item << " with memory reference " << &currObj << "\n";
    }
}

int main(int argc, char** argv) {
    for (unsigned int i = 0; i < 10; ++i) {
        ObjectGenerator *generator = new ObjectGenerator(i);
        generator->run();
    }

    for (unsigned int i = 10; i < 20; ++i) {
        ObjectGenerator *generator = new ObjectGenerator(i);
        generator->run();
    }

    return 0;
}

我不明白的是listOfObjectsWithData中的所有对象如何具有相同的内存引用(当用&amp;打印时)。

另外,我无法成功复制我想传达的内容。对于我遇到的问题,我试图将AST节点存储在一个列表中,如上例所示。但是当尝试访问它时,它会在第二个运行时实例中立即获得分段错误(尝试在main方法中使用2个for循环模拟多个运行时实例,不确定这是否合适)

我的猜测是,不同的运行时实例使得以前的运行时指针值可能已被其他东西完全覆盖。

但如果是这种情况,为什么上面的例子不会遇到分段错误?是因为'new'关键字运算符?

2 个答案:

答案 0 :(得分:4)

  

我不明白的是listOfObjectsWithData中的所有对象如何具有相同的内存引用(当用&amp;打印时)。

您打印本地指针变量currObj的内存地址。在循环的每次迭代中,局部变量将位于相同的位置。

  

为什么上面的例子没有遇到分段错误?

上述程序没有理由存在段错误。没有非法的内存访问。尽管你泄漏了所有已分配的内存,但程序的行为已经很好地定义了。

答案 1 :(得分:3)

&currObj指向currObj指针的地址,而不指向ObjectHoldingData实例。如果要查看ObjectHoldingData实例的地址,只需打印指针:

// No ampersand '&'.
cout << "Object " << currObj->item << " with memory reference " << currObj << "\n";