2012-11-10 36 views
0

我很久没有使用C++,现在我需要做一些小的“项目”。
我回顾几个主题试图找到我的问题没有结果的解决方案...
在相同的内存地址不需要创建对象

这里是“伪代码”(Pair是我班):

Pair** pairs; 

我拿到表的大小从指针的输入,并创建表:

pairs = new Pair*[size]; 

我有一个循环产生了一些对象,并把它的参考指针到表。更多或更少:

while (...) 
{ 
    Pair pair(...); // calling constructor, creating object type of Pair. 
    pairs[i] = &pair; 
    i++; 
} 

问题&pair是相同数量的每次(循环的每一步)。 假设第一个创建的对象的地址是1234. 因此,在循环中的每一步都会覆盖1234处的这个对象。因此pairs中的每个指针都指向相同的地址 - >相同的对象。 我想强制在内存中的新位置创建此对象。

我一直在试图把这些对象到其他表,然后通过他们的参考指针表:

Pair* clearPairs = new Pair[size]; 
while (...) 
{ 
    clearPairs[i] = Pair(...); 
    pairs[i] = &clearPairs[i]; 
    i++; 
} 

但问题仍然存在。

任何提示?,我的代码(或思想)中的错误/错误?我应该实施一些“复制构造函数”?

+1

是不是你在while循环中取本地地址。 更喜欢在每次循环时在堆上创建新对象 – Sarang

回答

4
while (...) 
{ 
    Pair pair(...); // calling constructor, creating object type of Pair. 
    pairs[i] = &pair; 
    i++; 
} 

pair被分配了自动存储持续时间并在循环的每次迭代时超出范围。你正在保存一个指向无效对象(一堆)的指针。

如果您需要指针(当对象不能被复制或副本昂贵时,这是真的),您应该使用智能指针的集合,这可能不是必需的。试试这个:

vector<Pair> pairs; 
// and if you need pointers... 
vector<unique_ptr<Pair>> pairs; 

while(whatever) { 
    pairs.push_back(Pair(...)); 
    // or... 
    pairs.push_back(unique_ptr<Pair>(new Pair(...))); 
} 
+0

好的,但是我仍然不知道为什么当我将这个'pair'对象放入单独的表中时它是错误的? –

+0

并假设Pair与'std :: pair'相似,I.E.一个键和一个值,你也可以使用'std :: map' - 但我在这里猜测。编辑的答案是一个很好的答案。 – Caribou

+0

我想在使用矢量时,我无法在特定位置访问对象(I.E.对[3])。任务是实现堆,所以我宁愿需要该选项(以及将NULL分配给表中的元素)。但我可能是错的... –

相关问题