[英]Should I use a pointer when dealing with lists?
当对象的寿命更长,甚至超出范围时,也应该使用指针,对吗?
在这里,我只是创建一个电影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;
在堆上还是这样? 什么是更好的风格?
“当对象的寿命更长,甚至超出范围时,也应该使用指针,对吗?”
尽管确实会在执行超出范围时自动破坏具有自动存储持续时间的本地对象,但这并不一定意味着动态分配的对象的寿命更长。
在您的应用程序中,您具有全局变量:
QList<Movie> movieList;
表示在程序执行的整个过程中一直存在的容器。
“以某种方式保留列表中的项目”
创建Movie
类型的对象并将其推入容器时:
Movie m;
...
movieList.push_back(m);
该对象的副本存储在列表中。 副本是在不同的情况下创建的,主要是当您按值传递或返回值时,但是在大多数情况下,它不会对程序的性能产生负面影响。 编译器将使用许多优化技术来提取副本...有时效果如此之好,以至于按值传递/返回可能比按引用传递更快。
“ 我应该使用指针在堆上创建
Movie m;
吗? ”
没有! 一旦开始动态分配对象,您就要对自己的内存进行管理,并且许多事情可能变得比原本要复杂得多……包括可能且非常频繁(通常是由于错误处理的不完善)而导致的内存泄漏问题, 悬空指针的问题可能使您陷入未定义行为和许多其他不愉快事物的陷阱。
尽可能避免动态内存分配。 使用具有自动存储期限的对象,了解RAII习惯用法并乐于跟随它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.