清除 C++ 中的指针的 STL 列表
Clear out the STL list of pointers in C++
我已经定义了一个指针列表。在清除列表之前,我应该如何释放所有这些指针?擦除所有列表成员的最佳方法是什么?在下面的程序中,是否需要释放分配给结构的内存?请参阅我的内联评论。
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();
我想了解下面的程序中是否有任何内存泄漏?
是的,你在这里有它:
p = (char*)malloc(MAX_LEN);
p = (char *)buf;
您分配内存并将其分配给p
下一行您将丢失它。所以:
- 不应在C++程序中使用
malloc()
,除非需要传递将由 C 代码管理的数据 - 您应该使用特殊的数据结构(如
std::string
等)来管理您的数据。 - 如果仍需要分配动态内存,请使用智能指针。
如果有任何内存泄漏,我应该如何调试?
您首先不会创建它们。例如,你怎么能写get_random_str
(假设你真的必须使用malloc
来分配它):
using spchar = std::unique_ptr<char[], decltype(std::free) *>;
spchar get_random_str( int len )
{
spchar s( static_cast<char *>( malloc( len + 1 ) ), std::free );
static const char alphanum[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
for (int i = 0; i < len; ++i) {
s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
}
s[len] = ' ';
return s;
}
注意,我没有编译这段代码,它是为了向您展示这个想法。
更新:看起来您认为此代码:
p = (char *)buf;
会将字符串从buf
复制到p
,但事实并非如此。相反,你p
指向malloc()
之前返回的buf
丢失旧值的内存(因此会产生内存泄漏),并将该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++,你应该得到更新的编译器和教科书。
在for_each
中使用 lambda 函数删除元素:
std::for_each(l_list.begin(), l_list.end(), [](const MyStruct* elem){if(elem) free(elem)});
和明确的指针:
l_list.clear();
相关文章:
- 如何检查C ++ STL列表是否为回文?
- 清除 C++ 中的指针的 STL 列表
- 在Visual Studio 2013中编译的STL列表代码在Visual Studio 2019中给出了错误.想知道原
- 使用.txt文件填充 STL 列表不起作用
- 为 STL 列表编写选择排序
- 如何从 STL 列表中删除结构记录
- C++如何将 STL 列表传递给函数
- 漂亮的打印不适用于C ++ STL列表
- 在C++中,是否可以引用像C++中的stl列表这样的数据结构部分
- 如何根据STL列表中的元素数量分配内存
- 我怎么知道,如果我在 STL 列表中找到了我搜索的号码
- 打印列表列表C++ STL 列表
- 我们可以在穿越时插入STL列表吗?
- 使用 c++ 的 STL 列表 ..在传递列表指针的数组中
- 使用 C++11 迭代语法时从 STL 列表中删除
- 如何使用静态 stl 列表的迭代器
- 如何更改 stl 列表中项的值
- STL列表,删除所有奇数
- 如何将函数中的stl列表传递为C 中的参数
- 如何将结构添加到STL列表中