在http://www.cplusplus.com/reference/list/list/erase/上的描述中,我得到了
This effectively reduces the container size by the number of elements removed,
which are destroyed.
Run Code Online (Sandbox Code Playgroud)
pop方法的类似描述.
但是在我对VS2012的测试中,删除的项目没有被破坏.我对此感到困惑.
这是我的测试代码.我仍然可以从std :: list删除的内存中输出,在我看来,这是错误的.
#include <stdio.h>
#include <list>
using namespace std;
class test
{
public:
int a;
test() {a = 111;}
};
int main(void)
{
list<test*> l;
test* t = new test;
l.push_back(t);
l.erase(l.begin());
printf("%d\n", t->a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该项被销毁,即它的析构函数被调用.唉,指针的析构函数什么都不做.特别是,它不会删除指向的对象.
请记住,与Java和C#不同,C++具有所有内容的值语义,而指针和引用是您必须始终自己处理的显式构造.因此,销毁指针并删除指向的对象是不同的操作.
如果您有C++ 11,则std :: unique_ptr 在列表中可用,并确保删除指向的对象,但它不可复制以强制执行正确的内存管理.如果需要复制,可以使用(也是C++ 11)std :: shared_ptr,它可以被复制,但是有一些运行时开销.
如果您没有C++ 11,可以使用Boost.PointerContainer或boost :: shared_ptr.
当然,大多数时候你不应该首先使用间接.在适用的C++中,首选按值操作对象.它特别适用于多态对象,但在实践中它们在C++中并不常见.
| 归档时间: |
|
| 查看次数: |
552 次 |
| 最近记录: |