【问题标题】:How to create a pointer without creating an object from inside a parameter list如何在不从参数列表中创建对象的情况下创建指针
【发布时间】:2016-03-23 05:40:34
【问题描述】:

我需要一个指向一些预先存在的对象的指针向量,所以我想直接在向量内创建一个指针。 我想调用我的向量的 emplace_back 函数,将 new 作为参数传递,但这不仅会创建我想要的指针,还会创建一个对象。为了摆脱这种不希望的附带效果,我会做一个 delete 指针,它实际上删除对象并将指针留在那里,然后我会将此指针设置为指向我想要的预先存在的对象.在代码中,它类似于:

 std::vector myVector<ClassType*>;
 myVector.emplace_back(new ClassType());
 delete myVector.end();
 myVector.end()=&preexistingObject;

但是,我认为创建一个对象只是因为我想要一个指针而立即删除它是一种浪费!

如何在不创建对象的情况下创建指针,而我可以从参数列表中(在本例中为 emplace_back 中)创建它?

我会写

ClassType *myPointer;

但问题是我无法根据需要从 emplace_back 函数内部执行此操作。

有什么建议吗?

感谢您的帮助,

古斯塔沃

【问题讨论】:

  • 首先,您发布的代码无法编译。其次,你的计划注定要失败。 myVector.end() 返回向量之外的值。不建议deleteing 和分配给它。 emplace_back 为您构建。因为它要做的只是构造一个指向ClassType 的指针,所以它对你没有多大作用。使用push_back 完成这项工作。
  • 感谢您的回推提示。以及如何在不从内部推回创建对象的情况下创建指针?
  • 没有连接对象的指针总是NULL - 但也不鼓励这样做。
  • 如我所说,之后我会立即指向正确的指针。所以,这不是问题
  • 基本原理是可以在不指向任何地方或创建任​​何对象的情况下制作指针。默认情况下,指针在初始化之前不会指向任何有用(或安全使用)的地方。我不知道您预先存在的对象是如何存储的。这就是为什么我没有发布答案。它可以像ClassType preexisting; myVector.push_back(&amp;preexisting);ClassType * preexisting = new ClassType(); myVector.push_back(preexisting); 一样简单,但我能做的最好的就是猜测。

标签: c++ pointers object vector containers


【解决方案1】:

答案是按照 user4581301 的建议将预先存在的对象的地址传递给我的容器。

唯一棘手的一点是我的软件有时会开始崩溃,我跟踪它是指向 gargabe 的指针的问题。

发生这种情况是因为我预先存在的对象存储在一个向量 (std::vector) 中,当我的向量变得太大时,我所有的指针都会变得无效,因为...向量改变了它的内存地址当它必须为更多物品腾出空间时的内容!

解决方案是将预先存在的对象存储在一个列表 (std::list) 中,这样可以保证当列表变得太大时,我的预先存在的对象的地址不会改变。

要在代码中恢复,我必须:

std::list<PreExistingClass> myContainerOfObjects; //This HAS to be a list. Otherwise, dangling pointers!
std::vector<PreExistingClass*> myContainerOfPointerToObjects 

myContainerOfObjects.emplace_back(); 
myContainerOfPointerToObjects.emplace_back(&(myContainerOfObjects.back())); 

谢谢! 古斯塔沃

【讨论】:

    猜你喜欢
    • 2020-07-25
    • 2023-03-10
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    相关资源
    最近更新 更多