在同一内存地址创建不需要的对象 我很久没有用C++工作了,现在我需要做一些小项目。 我复习了几个主题,试图找到解决问题的方法,但没有结果
下面是我的类的伪代码对:在同一内存地址创建不需要的对象 我很久没有用C++工作了,现在我需要做一些小项目。 我复习了几个主题,试图找到解决问题的方法,但没有结果,c++,arrays,pointers,memory,C++,Arrays,Pointers,Memory,下面是我的类的伪代码对: Pair** pairs; 我从输入中获取表的大小,并创建指针表: pairs = new Pair*[size]; Pair* clearPairs = new Pair[size]; while (...) { clearPairs[i] = Pair(...); pairs[i] = &clearPairs[i]; i++; } 我有一个循环,它创建一些对象并将其引用放入指针表中。或多或少: while (...) {
Pair** pairs;
我从输入中获取表的大小,并创建指针表:
pairs = new Pair*[size];
Pair* clearPairs = new Pair[size];
while (...)
{
clearPairs[i] = Pair(...);
pairs[i] = &clearPairs[i];
i++;
}
我有一个循环,它创建一些对象并将其引用放入指针表中。或多或少:
while (...)
{
Pair pair(...); // calling constructor, creating object type of Pair.
pairs[i] = &pair;
i++;
}
问题是&对每次循环的每一步都是相同的数字。
假设第一个创建的对象的地址是1234。
因此,循环中的每一步都会在1234处覆盖该对象。因此,成对的每个指针都指向相同的地址->相同的对象。
我想强制在内存中的新位置创建此对象
我一直在尝试将这些对象放入其他表中,然后将它们的引用传递给指针表:
pairs = new Pair*[size];
Pair* clearPairs = new Pair[size];
while (...)
{
clearPairs[i] = Pair(...);
pairs[i] = &clearPairs[i];
i++;
}
但问题仍然存在
我的代码或思维中有任何提示、错误/错误吗?我应该实现一些复制构造函数吗
while (...)
{
Pair pair(...); // calling constructor, creating object type of Pair.
pairs[i] = &pair;
i++;
}
对分配了自动存储持续时间,并在循环的每次迭代时超出范围。您正在将指向无效对象的指针保存为一组指针
如果确实需要指针,则应该使用智能指针的集合。当对象无法复制或复制成本很高时,这一点是正确的,因为复制可能根本不需要。请尝试以下方法:
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(...)));
}
对分配了自动存储持续时间,并在循环的每次迭代时超出范围。您正在将指向无效对象的指针保存为一组指针
如果确实需要指针,则应该使用智能指针的集合。当对象无法复制或复制成本很高时,这一点是正确的,因为复制可能根本不需要。请尝试以下方法:
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(...)));
}
你不是在while循环中使用本地地址吗。更喜欢每次循环时在堆上创建新对象,而不是在while循环中获取本地地址。我更喜欢每次循环都在堆上创建新对象,好吧,但我仍然不知道为什么我把这个pair对象放在单独的表中是错误的?假设pair类似于std::pair,即一个键和一个值,也可以使用std::map,但我在这里猜测。Eds的答案很好。我认为当使用向量时,我无法访问特定位置的对象,即对[3]。任务是实现heap,所以我宁愿需要该选项,也需要为表中的元素分配NULL。但我可能错了……例如,您可以像使用数组和访问对[3]一样使用std::vector。此外,还可以添加空元素。无论如何,如果只需要添加固定数量的项,可以使用数组too@Daniel卡斯特罗,谢谢。我只是在做一些关于向量的研究,还发现了信息;。不幸的是,数组的大小是动态的,用户输入大小。好吧,但我仍然不知道为什么我把这个pair对象放在单独的表中是错误的?假设pair类似于std::pair,即一个键和一个值,您也可以使用std::map-但我在这里猜测。Eds的答案很好。我认为当使用向量时,我无法访问特定位置的对象,即对[3]。任务是实现heap,所以我宁愿需要该选项,也需要为表中的元素分配NULL。但我可能错了……例如,您可以像使用数组和访问对[3]一样使用std::vector。此外,还可以添加空元素。无论如何,如果只需要添加固定数量的项,可以使用数组too@Daniel卡斯特罗,谢谢。我只是在做一些关于向量的研究,还发现了信息;。不幸的是,数组的大小是动态的,用户输入大小。