C++ 清除C+中指针的STL列表+;
我已经定义了一个指针列表。在清除列表之前,我应该如何释放所有这些指针?删除所有列表成员的最佳方法是什么?在下面的程序中,是否需要释放为struct分配的内存??请参阅我的内联注释C++ 清除C+中指针的STL列表+;,c++,list,pointers,stl,C++,List,Pointers,Stl,我已经定义了一个指针列表。在清除列表之前,我应该如何释放所有这些指针?删除所有列表成员的最佳方法是什么?在下面的程序中,是否需要释放为struct分配的内存??请参阅我的内联注释 struct MyStruct { char *data; int len; }; typedef std::list<struct MyStruct *> myStruct_list; myStruct_list l_list; /* Prepare a list */ for( i
struct MyStruct {
char *data;
int len;
};
typedef std::list<struct MyStruct *> myStruct_list;
myStruct_list l_list;
/* Prepare a list */
for( int i = 0; i < 10; i++) {
struct MyStruct *s = (MyStruct *)malloc(sizeof(struct MyStruct));
s->data = (char*)malloc(MAX_LEN);
get_random_data(s->data,size);
s->len = strlen(s->data);
l_list.push_back(s);
}
/* Delete all members from a list */
myStruct_list::iterator it;
for (it = l_list.begin(); it != l_list.end(); ++it) {
if (*it) {
free(*it); // --->> do I need to free (*it)->data ?????
}
}
l_list.clear();
struct MyStruct{
字符*数据;
内伦;
};
typedef std::list myStruct_list;
myStruct_list l_list;
/*准备一份清单*/
对于(int i=0;i<10;i++){
struct MyStruct*s=(MyStruct*)malloc(sizeof(struct MyStruct));
s->data=(char*)malloc(MAX_LEN);
获取随机数据(s->数据,大小);
s->len=strlen(s->data);
l_列表。将_向后推;
}
/*从列表中删除所有成员*/
myStruct_list::迭代器;
for(it=l_list.begin();it!=l_list.end();++it){
如果(*it){
免费(*it);//-->>我需要免费(*it)->数据吗?????
}
}
l_list.clear();
我想知道下面的程序有没有内存泄漏
是的,就在这里:
p = (char*)malloc(MAX_LEN);
p = (char *)buf;
您分配内存并将其分配给p
,然后在下一行将其释放。因此:
std::string
等来管理数据get\u random\u str
(假设您确实必须使用malloc
分配它):
将字符串从buf
复制到p
,情况并非如此。相反,您将p
指向buf
的内存,释放之前返回的malloc()
旧值(因此产生内存泄漏),并将buf
的地址分配给data
,在调用free()
时会导致UB,因此您需要的是:
strncpy( p, buf, MAX_LEN );
但即使这样也不是必需的,因为您根本不需要buf
:
void myClass::fillData(void)
{
s = (MyStruct *)malloc(sizeof(struct MyStruct));
s->data = (char*)malloc(MAX_LEN);
get_random_str(s->data,950);
s->len = strlen(s->data);
l_list.push_back(s);
}
<>但是这是更多的C代码,使用了一些C++语法。如果你真想学习C++,请使用新的编译器和教科书。 < P>使用 < >代码> 中使用lambda函数删除元素。
std::for_each(l_list.begin(), l_list.end(), [](const MyStruct* elem){if(elem) free(elem)});
并明确指出:
l_list.clear();
你为什么在这里用指针?我看没有理由这么做,如果你删除它们,那么你就不必担心泄漏:)你为什么要使用malloc?这个代码的一半看起来更像C而不是C++。<代码> STD:::清单:迭代器;对不起,你是从过去来的吗?说真的,如果你不是在使用一些遗留系统,你真的需要更新你的学习材料。抱歉,这是一个示例程序。我刚开始学习C++。我想了解指针和STL容器。所以我编写了示例程序。
s[len]='\0'代码>不会很好地结束,而不是自己分配和终止字符串,考虑使用<代码> STD::String 。你是对的。它将来可能会被一些C代码使用。这就是我使用malloc的原因。您仍然可以使用智能指针和自定义删除器从malloc中释放内存。但更大的问题是,您正在编写C代码,而不是C++@M.Rock如果您正在编写代码,以便将来C可能会使用它,那么您正在编写C代码。如果您的代码不是C,那么在移植它时,使用malloc
是您最不关心的。然后我将这个p分配给struct data成员。所以我没有松开它,但我有第一个列表成员,它指向这个。我可以跟踪这件事。而且,在我的环境中,他们似乎没有升级g++。他们似乎还在使用旧版本。因此不支持智能指针。@M.Rock如果您确实松开了它,我从您的问题中复制了两行代码,您将malloc
的结果分配给p
,下一行将buf
分配给p
,丢失了之前返回的malloc
内存地址。将buf
分配给p
会产生另一个问题-您使用buf
调用std::free
,这也是UB。看起来你想要strcpy(p,buff)代码>而不是p=buff代码>如果你想使用指针,可以了解它们。更好的建议是使用std::list
的std::unique_ptr
s,这将保证在销毁列表时销毁指向的结构。当然,这是假设OP首先真的需要存储指向结构的指针……那么“为什么我有内存泄漏?”的答案应该是“因为您使用的是原始指针”。释放他们可以对抗症状,而不是原因;)不是dv,而是如果(elem)
是多余的,那么在空指针上调用free
是合法的。(另外,几乎完全基于观点,但与基于范围的for循环相比,每个std::for_
似乎有点臃肿(const auto elem:l_list)
)。这为什么被如此严厉地否决?它专门针对他们已有的代码回答ops问题。。。
std::for_each(l_list.begin(), l_list.end(), [](const MyStruct* elem){if(elem) free(elem)});
l_list.clear();