当一个物体的寿命更长时,即使它超出范围,也应该使用指针,对吗?
我在这里创建一个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;
还是这样可以?什么是更好的风格?
答案 0 :(得分:2)
“当对象活得更长时,即使它超出范围,也应该使用指针,对吧?”
虽然具有自动存储持续时间的本地对象确实会在执行超出范围时自动销毁,但这并不一定意味着动态分配的对象会活得更久。
在您的应用程序中,您有全局变量:
QList<Movie> movieList;
表示在程序执行的整个过程中存在的容器。
“不知何故,列表中的项目保持”
创建Movie
类型的对象并将其推入容器时:
Movie m;
...
movieList.push_back(m);
此对象的副本存储在列表中。正在创建不同情况下的副本,主要是在您通过或按值返回时,但在大多数情况下,它将对您的程序性能没有负面影响。您的编译器将使用许多优化技术来删除副本...有时候这样有效地通过值传递/返回可能比通过引用传递更快。
“我应该使用指针并在堆上创建
Movie m;
吗?”
不!一旦你开始动态分配对象,你就要自己承担内存管理的责任,许多事情可能会变得更加复杂,以至于它们可能会出现......包括可能和非常频繁(通常是由于错误处理方面的不完善) 内存泄漏 的问题, 悬空指针 的问题可能会导致您跌倒进入 未定义行为 的坑中以及许多其他令人不快的东西。
在可能的情况下始终避免动态内存分配。 使用具有自动存储持续时间的对象,了解RAII idiom并高兴地关注它。