【问题标题】:Unwanted creation of object at same memory address在同一内存地址不需要创建对象
【发布时间】:2012-11-10 19:37:01
【问题描述】:

我已经很久没有使用 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++;
}

但问题仍然存在。

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

【问题讨论】:

  • 你不是在while循环中获取本地地址吗?每次循环时更喜欢在堆上创建新对象

标签: c++ arrays pointers memory


【解决方案1】:
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(...)));
}

【讨论】:

  • 好的,但是我把这个pair对象放到单独的表中还是不知道为什么会出错?
  • 并假设 Pair 类似于std::pair,即您也可以使用 std::map 的键和值 - 但我在这里猜测。 Eds 的回答很好。
  • 我认为当使用向量时,我无法访问特定位置的对象(即对 [3])。任务是实现堆,所以我宁愿需要那个选项(以及将 NULL 分配给表中的元素)。但我可能错了……
  • 例如,您可以像使用数组一样使用 std::vector 并访问对[3]。此外,您可以添加 NULL 元素。无论如何,如果您只需要添加固定数量的项目,您也可以使用数组
  • @Daniel Castro,谢谢。我只是对矢量进行了一些研究,并且还发现了该信息;)。不幸的是,数组的大小是动态的(用户输入大小)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 2010-12-06
  • 2012-01-29
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
相关资源
最近更新 更多