iht*_*wot 2 c++ arrays pointers memory-management
我需要有关指针和内存管理的帮助.
我需要存储不同的对象,所有对象都派生自相同的基类,并且一直使用数组来执行此操作,但是当使用不同的对象填充数组时,它会导致分段错误.
当数组中充满了相同派生类型的对象时,我的程序工作正常.当数组填充不同的对象时,它应该通过存储在第一个位置的对象,但是当它切换到输出第二个对象时,它会给我分段错误.我知道这是一个内存访问问题,但我不清楚我应该如何管理依赖于用户输入的可变数量的对象.
thx,nmr
确保您在堆栈上推送的指针是动态分配的.以下将失败:
std::vector<Base*> objects;
void make_one(void)
{
Derived d;
objects.push_back(&d);
}
Run Code Online (Sandbox Code Playgroud)
因为当函数结束时,指向的类&d将被释放.通过动态分配对象可以缓解这种情况:
std::vector<Base*> objects;
void make_one(void)
{
Derived *d = new Derived;
objects.push_back(d); // a-ok
}
Run Code Online (Sandbox Code Playgroud)
只要记得在完成后通过向量,并打电话delete给他们:
struct deleter
{
template <typename T>
void operator()(T* pObject) const
{
delete pObject;
}
}
std::for_each(objects.begin(), objects.end(), deleter());
Run Code Online (Sandbox Code Playgroud)
如果你可以使用boost,那么有一个指针容器库可以帮你完成.注意,你不能使用auto_ptr并尝试让它为你做; auto_ptr容器配不好用.
另外,确保您的基类具有虚拟析构函数:
struct base
{
virtual ~base(void) {} // important!
}
Run Code Online (Sandbox Code Playgroud)
如果不是,则调用delete基类将仅运行基础构造函数,泄漏派生类可能具有的任何资源.通过使其成为虚拟,编译器可以跳转到正确的析构函数.
| 归档时间: |
|
| 查看次数: |
450 次 |
| 最近记录: |