C和C++中未定义,未指定和实现定义的行为有什么区别?
c c++ undefined-behavior unspecified-behavior implementation-defined-behavior
为什么使用std::auto_ptr<>标准容器是错误的?
我有一个指向对象的向量.我需要从向量中删除一个元素并将该元素放在另一个列表中.
我读到擦除可以用来从向量中删除对象,但我还读到它在执行之前调用对象析构函数.
我需要知道擦除对象是否也会破坏它.
来自c ++ FAQ:http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.9
记住:delete p有两件事:它调用析构函数并释放内存.
如果删除释放内存,那么析构函数需要什么?
为什么我需要手动删除向量中动态创建的项目?当向量被删除时,为什么它们不会被删除或者它的析构函数被调用?
通常是这样的,但为什么需要?
vector<int*> v;
for (vector<int*>::iterator it = v.begin(); it != v.end(); ++it)
{
delete *it;
}
Run Code Online (Sandbox Code Playgroud) 我有一个SpriteHandler类,允许用户注册指向Sprite对象的指针以进行绘制,它所做的就是访问对象上的方法.我想编写一个安全捕获程序,如果用户在程序结束时忘记这样做,则会自动删除与指针关联的内存(而且对用户来说也不用担心!):
//SpriteHandler.h
class SpriteHandler {
public:
//...
void RegisterObject(Sprite* object);
bool IsRegistered(Sprite* object);
void UnregisterObject(Sprite* object);
private:
//...
static std::list<Sprite*>* _sprite = NULL;
};
//SpriteHandler.cpp
std::list<Sprite*>* SpriteHandler::_sprites = NULL;
void SpriteHandler::RegisterObject(Sprite* object) {
if(object == NULL) return;
if(_sprites == NULL) _sprites = new std::list<Sprite*>();
_sprites->push_back(object);
_sprites->sort(UDLessSprite);
}
bool SpriteHandler::IsRegistered(Sprite* object) {
return std::binary_search(_sprites->begin(), _sprites->end(), object);
}
void SpriteHandler::UnregisterObject(Sprite* object) {
if(object == NULL) return;
if(IsRegistered(object) == false) return;
_sprites->remove(object);
if(_sprites->size() <= 0) { …Run Code Online (Sandbox Code Playgroud) 我有一个指向其他对象的指针数组Comparable* array(在类的模板中).
我理解delete删除指针引用的内存,并delete []释放分配给数组中每个指针的内存.
我的问题是,如果我有一个包含指向其他对象的指针的数组,如何释放数组中每个指针和数组本身引用的内存?
如果我有一个std :: vector定义为:
std::vector<Object*>* myObjects;
Run Code Online (Sandbox Code Playgroud)
然后打电话:
delete myObjects;
Run Code Online (Sandbox Code Playgroud)
那么myObjects中的元素也会被删除吗?使用std :: array或任何其他stl容器有什么区别吗?
提前致谢
c++ ×8
allocation ×2
destructor ×2
memory ×2
stl ×2
auto-ptr ×1
c ×1
c++-faq ×1
implementation-defined-behavior ×1
iterator ×1
raii ×1
stdlist ×1
vector ×1