Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;内存管理_C++_Memory_Pointers_New Operator - Fatal编程技术网

C++ c++;内存管理

C++ c++;内存管理,c++,memory,pointers,new-operator,C++,Memory,Pointers,New Operator,这是一种删除由新对象生成的长对象和对象的映射的好方法吗 // iterate over the map for (std::map<unsigned long, Object*>::iterator it = objects.begin(), it_end = objects.end(); it != it_end; ++it) { Object* temp = it->second; if(temp) delete temp; } // cl

这是一种删除由新对象生成的长对象和对象的映射的好方法吗

// iterate over the map
for (std::map<unsigned long, Object*>::iterator it = objects.begin(), it_end = objects.end(); it != it_end; ++it)
{
    Object* temp = it->second;
    if(temp)
        delete temp;
}

// clear the map
objects.clear();
//在地图上迭代
对于(std::map::iterator it=objects.begin(),it_end=objects.end();it!=it_end;++it)
{
对象*temp=it->second;
如果(临时)
删除临时文件;
}
//清除地图
对象。清除();

是的,虽然更好的解决方案是使用智能指针而不是
对象*
,但这是一个不同的主题

您可以将for的内容缩短为

{
   delete it->second;
}

delete null
已定义,是一个noop。

是的,虽然更好的解决方案是使用智能指针而不是
对象*
,但这是一个不同的主题

您可以将for的内容缩短为

{
   delete it->second;
}

delete null
已定义,是noop。

是。使用boost::ptr_映射

boost::ptr_map<std::string, BigObject>   data;

data.insert("Plop", new BigObject);
boost::ptr_地图数据;
数据插入(“Plop”,新的BigObject);
当数据超出范围时,它将删除其所有
成员。
此外,对于算法,所有成员都作为对象的引用返回(而不是指针),因此与标准算法一起使用要比std::map容易得多,在std::map中,您需要在使用前取消对memebr的引用


人们首先会问,为什么有指向int/long的指针映射?仅仅在地图中存储值不是更容易吗?

是的。使用boost::ptr_映射

boost::ptr_map<std::string, BigObject>   data;

data.insert("Plop", new BigObject);
boost::ptr_地图数据;
数据插入(“Plop”,新的BigObject);
当数据超出范围时,它将删除其所有
成员。
此外,对于算法,所有成员都作为对象的引用返回(而不是指针),因此与标准算法一起使用要比std::map容易得多,在std::map中,您需要在使用前取消对memebr的引用


人们首先会问,为什么有指向int/long的指针映射?仅仅将值存储在映射中不是更容易吗?

这是一种完美的删除方法


尽管使用智能指针可以让你的生活更轻松。

这是一种完美的删除方式

尽管使用智能指针可以让你的生活更轻松。

这是一个好的开始

删除对象后,应该从映射中删除指针或将其设置为NULL以避免指针悬空。编辑:当然,您也可以在完成后清除地图,如您的示例所示

当您将指针存储在任何标准容器中时,总是存在异常或某些代码错误导致内存泄漏的可能性。我建议另作选择。

这是一个好的开始

删除对象后,应该从映射中删除指针或将其设置为NULL以避免指针悬空。编辑:当然,您也可以在完成后清除地图,如您的示例所示


当您将指针存储在任何标准容器中时,总是存在异常或某些代码错误导致内存泄漏的可能性。我建议另作选择。

是的。不管什么可能被认为是设计或架构问题(例如,使用更智能的指针),使用该方法清除映射并不是不合理的

一个限制条件是:
对象
映射不应该因为对象*指针的破坏而改变。如果是的话,最好使用以下内容:

// iterate over the map
typedef std::map<unsigned long, Object*>::iterator map_iter;
for (map_iter it = objects.begin();
    it != objects.end();
    /* blank */ )
{
    iter_map to_delete = it;
    ++it;
    Object* temp = to_delete->second;
    if(temp)
        delete temp;
    objects.delete(to_delete);
}
//在地图上迭代
typedef std::map::迭代器映射;
for(map_iter it=objects.begin();
it!=objects.end();
/*空白*/)
{
iter_映射到_delete=it;
++它;
对象*temp=要删除->秒;
如果(临时)
删除临时文件;
对象。删除(要删除);
}

是。不管什么可能被认为是设计或架构问题(例如,使用更智能的指针),使用该方法清除映射并不是不合理的

一个限制条件是:
对象
映射不应该因为对象*指针的破坏而改变。如果是的话,最好使用以下内容:

// iterate over the map
typedef std::map<unsigned long, Object*>::iterator map_iter;
for (map_iter it = objects.begin();
    it != objects.end();
    /* blank */ )
{
    iter_map to_delete = it;
    ++it;
    Object* temp = to_delete->second;
    if(temp)
        delete temp;
    objects.delete(to_delete);
}
//在地图上迭代
typedef std::map::迭代器映射;
for(map_iter it=objects.begin();
it!=objects.end();
/*空白*/)
{
iter_映射到_delete=it;
++它;
对象*temp=要删除->秒;
如果(临时)
删除临时文件;
对象。删除(要删除);
}

我建议使用智能指针,例如
std::unique_ptr
(这是一个C++0x特性,并非所有编译器都支持它)。例如:

std::map<unsigned long, std::unique_ptr<Object>> map;
// Do something with the map
map.clear(); // The objects are automatically deleted.
std::map;
//用这张地图做点什么
map.clear();//对象将自动删除。
您还可以使用
std::shared_ptr
(或者
boost::shared_ptr
,如果您的编译器不支持C++0x智能指针),这样做的好处是,如果您的映射可以多次包含同一指针,那么它就可以工作,并且如果其他人仍然有指向对象的指针,您的对象就不会被销毁


boost::ptr\u map
也是一个选项,尽管我相信,与手动方法一样,如果map多次包含同一指针,则无法正常工作。

我建议使用智能指针,例如
std::unique\u ptr
(这是一个C++0x特性,但并非所有编译器都支持它)。例如:

std::map<unsigned long, std::unique_ptr<Object>> map;
// Do something with the map
map.clear(); // The objects are automatically deleted.
std::map;
//用这张地图做点什么
map.clear();//对象将自动删除。
您还可以使用
std::shared_ptr
(或者
boost::shared_ptr
,如果您的编译器不支持C++0x智能指针),这样做的好处是,如果您的映射可以多次包含同一指针,那么它就可以工作,并且如果其他人仍然有指向对象的指针,您的对象就不会被销毁

boost::ptr_map
也是一个选项,但我相信,与手动方法一样,如果map多次包含同一指针,则无法正常工作。

前提是