Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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++ std::vector.clear()是否删除每个元素上的(可用内存)?_C++_Std - Fatal编程技术网

C++ std::vector.clear()是否删除每个元素上的(可用内存)?

C++ std::vector.clear()是否删除每个元素上的(可用内存)?,c++,std,C++,Std,考虑以下代码: #include <vector> void Example() { std::vector<TCHAR*> list; TCHAR* pLine = new TCHAR[20]; list.push_back(pLine); list.clear(); // is delete called here? // is delete pLine; necessary? } #包括 void示例() { std

考虑以下代码:

#include <vector>

void Example()
{
    std::vector<TCHAR*> list;
    TCHAR* pLine = new TCHAR[20];
    list.push_back(pLine);
    list.clear();    // is delete called here?
    // is delete pLine; necessary?
}
#包括
void示例()
{
std::向量表;
TCHAR*pLine=新的TCHAR[20];
列表。推回(pLine);
list.clear();//这里调用delete吗?
//是否需要删除pLine?
}
是否对每个元素调用
delete
?也就是说,我是否必须在
list.clear()
之前/之后释放内存?

否(您需要按照您在示例中的建议,在最后删除自己,因为删除秃头指针没有任何作用)。但是,您可以使用boost[或其他基于RAII的习惯用法]智能指针来确保它做正确的事情(
auto_ptr
在容器中无法正常工作,因为它在复制等情况下具有不兼容的行为),但请确保在使用前了解此类智能指针的缺陷。(正如Benoit提到的,在本例中,
basic_string
才是您真正想要的。)

尽管有必要了解智能指针的缺陷,但让它们隐式地管理内存,这样就不必显式地管理内存,这样就不太容易出错


编辑:由于Earwicker和James Matta的大力推动,对Benoit的回答进行了实质性修改,使其包含了更为全面的内容-感谢您敦促我对此进行尽职调查

没有。它不会这样做,因为不能保证您不会在其他任何地方使用指针。如果它不是指针变量,它将释放它们(通过调用析构函数)

std::vector
在调用
clear()
时会调用它包含的每个元素的析构函数。 在您的特定情况下,它会破坏指针,但对象仍然存在

智能指针是正确的方法,但要小心<代码>自动ptr不能用于std容器中<代码>boost::作用域_ptr也不能<代码>boost::shared_ptr可以,但它在您的情况下不起作用,因为您没有指向对象的指针,实际上是在使用数组。因此,解决问题的方法是使用


但是我建议您改用
std::basic_string
,这样您就不必处理内存管理,同时仍然可以从使用字符串中获得好处。

这里有一种方法可以告诉您它没有-在未完全定义的类上尝试它:

#include <vector>
class NotDefined;

void clearVector( std::vector<NotDefined*>& clearme )
{
    clearme.clear();    // is delete called here?
}
#包括
未定义类别;
void clearVector(标准::vector和clearme)
{
clearme.clear();//这里调用delete吗?
}

如果此代码段已编译,则它不能调用析构函数,因为析构函数未定义。

您也可以使用。这里不特别推荐(同样是因为您使用的是数组而不是单个对象,虽然
std::string
可以解决这一问题),但它是一个有用的、鲜为人知的库,可以解决标题中所述的问题。

您可以编写一个简单的模板函数来实现这一点:

template <class T>
void deleteInVector(vector<T*>* deleteme) {
    while(!deleteme->empty()) {
        delete deleteme->back();
        deleteme->pop_back();
    }

    delete deleteme;
}
模板
void deleteInVector(向量*deleteme){
而(!deleteme->empty()){
删除deleteme->back();
deleteme->pop_back();
}
删除删除我;
}

也许这里有些不好的做法,但我不这么认为。虽然评论总是很好,但对我来说还不错。

好的观点,请随意将这些细节编辑到我的答案中。。。(我在我的C++中有点生锈,我没提到基本字符串)当我来进行内存管理时,我有点控制狂。我生活在嵌入式(手机)发展的土地上。使用部分管理的API让我毛骨悚然。UI下的层是ANSI C。你认为“部分管理”是什么?共享数组还是基本字符串?不管怎样,我认为它相当完整!如果您想控制内存管理,我首先不会使用std::vector。它可能会保留记忆而不告诉你@贝诺特:哦,是的,我给了你10英镑,让你朝着3公里的方向走@伊格纳斯:总的来说,很值得探索托管内容和RAI模式(我在.NET中探索了几年,但在此之前,我已经在很多年前写了我最后一次的删除/释放!)@Ruben Bartelink:谢谢,但我想还有很长的路要走@Ignas:std::vector应该如何知道如何删除指针?它可能被分配了new、malloc或任何其他内存分配功能(特定于操作系统,手写),无法从类型中区分。无法使用auto_ptr。与STL容器一起使用时,自动\u ptr中断。您应该编辑答案以删除参考自动\u ptr。实际上不可能在容器中使用它。@JM删除前面的无序评论,我认为我是谁!这并不能真正解决问题。如果
list.push_back(pLine)
抛出,内存仍将泄漏。对我们来说,正确的做法是
std::vector
而不是
TCHAR*
。这是一种糟糕的方法。到处都有指针,使得程序非常慢。现在编写快速程序的关键方法是始终使用连续内存,最好的方法是直接使用向量,而不是指针。