类上的 C++ 容器,返回指针
Posted
技术标签:
【中文标题】类上的 C++ 容器,返回指针【英文标题】:C++ containers on classes, returning pointers 【发布时间】:2010-04-17 01:59:13 【问题描述】:由于我缺乏经验,我很难找到完成我的想法的最佳方法。我有一个类,我需要一个对象向量。所以我的第一个问题是:
这样有没有问题:vector container* 然后在构造函数上用 new 初始化它(并在析构函数上删除它)?另一个问题是:如果这个向量要存储对象,它不应该更像 vector 以便可以动态创建它们吗?在那种情况下,我将如何从方法中返回对象以及如何避免内存泄漏(尝试仅使用 STL)?
【问题讨论】:
【参考方案1】:是的,您可以使用vector<AnyType> *container
并新建/删除它。使用下标符号访问其元素时要小心;一定要说(*container)[i]
,而不是container[i]
,或者更糟的是*container[i]
,这可能会编译并导致崩溃。
当您执行vector<AnyType>
时,会根据需要自动调用构造函数/析构函数。但是,如果您计划传递对象,这种方法可能会导致不需要的对象复制。尽管vector<AnyType>
为最明显的操作提供了更好的语法糖,但我推荐vector<AnyType*>
用于非原始对象,因为它更灵活。
【讨论】:
谢谢。但是,如果我有 vector 并且我想返回一个元素,我是否必须使用 AnyType 复制构造函数执行类似 return new AnyType(..) 之类的操作?我相信我不能直接从向量中返回元素,对吧? 向量包含指针,它们是元素。只要指针仍然有效,您就可以使用它。如果指针指向一个动态分配的对象,那么它一直有效,直到有人删除它,那个人就是你。因此,如果您打算在调用者使用完对象之前删除该对象,那么您需要返回该对象的副本(或使用引用计数)。如果您正在复制,通常最好按值返回它,而不是使用new
创建一个副本并返回一个指针。 C++ 根本就不是 Java。【参考方案2】:
这样有什么问题吗:vector *container 然后在构造函数上用 new 初始化它(并在析构函数上删除它)
不,没有问题。但基于此,也不需要动态分配向量。
只需让向量成为类的成员:
class foo
std::vector<AnyType> container;
...
容器将与 foo 的实例一起自动构造/销毁。既然这是你对你想做的事情的全部描述,那就让编译器为你完成工作。
【讨论】:
【参考方案3】:不要对任何东西使用 new 和 delete。
有时你必须这样做,但通常你不会这样做,所以尽量避免它,看看你是怎么过的。如果没有更具体的例子,很难准确解释,但特别是如果你正在这样做:
SomeType *myobject = new SomeType();
... use myobject for something ...
delete myobject;
return;
那么首先这段代码容易泄露,其次应该替换为:
SomeType myobject;
... use myobject for something (replacing -> with . etc.) ...
return;
尤其不要使用 new 创建向量 - 这几乎总是错误的,因为实际上向量几乎总是有一个明确定义的所有者。该所有者应该有一个 vector 变量,而不是他们必须记住要删除的指向向量的指针。您不会动态分配 int
只是为了作为循环计数器,也不会动态分配向量只是为了保存一些值。在 C++ 中,所有类型在许多方面都可以像内置类型一样表现。问题是您希望它们拥有什么样的生命周期,以及(有时)通过价值传递或以其他方式复制它们是否昂贵。
不应该更像vector,这样就可以动态创建了吗?
仅当出于其他原因需要动态创建它们时,除了您想将它们组织在一个向量中。在你找到那个原因之前,不要寻找一个。
在这种情况下,我将如何从方法中返回对象以及如何避免内存泄漏(尝试仅使用 STL)?
标准库并没有真正提供在所有常见情况下避免内存泄漏的工具。如果您必须管理内存,我向您保证,获得shared_ptr
的实现比没有实现它更容易。
【讨论】:
以上是关于类上的 C++ 容器,返回指针的主要内容,如果未能解决你的问题,请参考以下文章