1

当一个对象的寿命应该更长时,即使它超出范围,也应该使用指针,对吧?

这里我只是创建了一个 Movie m;. 它将在堆栈上创建并在超出范围时自动删除。

//In some header file
typedef struct{
Qstring name;
int id;
//...
} Movie ;


QList<Movie> movieList; //It's the same as the standard list of c++. 

//In a function somewhere else
void doSomething(/*...*/)
{
//Do something...
Movie m = { /* ... */ };
movieList.push_back( m );
}

列表将 T 类型的常量引用作为参数。所以是地址,对吧?但是当Movie m;超出范围时,它将被删除。不知何故,列表中的项目仍然存在。

但是,我的问题是我应该使用指针并Movie m;在堆上创建还是这样?什么是更好的风格?

4

1 回答 1

2

“当一个对象的寿命应该更长时,即使它超出范围,也应该使用指针,对吧?”

虽然当执行超出范围时,具有自动存储持续时间的本地对象会自动销毁,但这并不一定意味着动态分配的对象会活得更长。

在您的应用程序中,您有全局变量:

QList<Movie> movieList;

表示在程序执行的整个过程中都存在的容器。

“不知何故,列表中的项目保持不变”

当您创建一个类型的对象Movie并将其推送到您的容器中时:

Movie m;
...
movieList.push_back(m);

该对象的副本存储在列表中。副本是在不同的情况下创建的,主要是在您按值传递或返回时,但在大多数情况下,它不会对程序的性能产生负面影响。您的编译器将使用许多优化技术来删除副本……有时如此有效,以至于按值传递/返回可能比按引用传递更快。

我应该使用指针并Movie m;在堆上创建吗?

不!一旦你开始动态分配对象,你自己负责内存管理,许多事情可能会变得更加复杂,否则它们可能会变得更加复杂......包括可能和非常频繁(通常由于错误处理中的不完善)的内存泄漏问题,悬空指针的问题可能使您陷入未定义行为和许多其他令人不快的事情的坑中。

尽可能避免动态内存分配。使用具有自动存储持续时间的对象,了解RAII 习语并乐于遵循它。

于 2013-09-29T19:36:17.283 回答