清除 C++ 中的指针的 STL 列表

Clear out the STL list of pointers in C++

本文关键字:STL 列表 指针 清除 C++      更新时间:2023-10-16

我已经定义了一个指针列表。在清除列表之前,我应该如何释放所有这些指针?擦除所有列表成员的最佳方法是什么?在下面的程序中,是否需要释放分配给结构的内存?请参阅我的内联评论。

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下一行您将丢失它。所以:

  1. 不应在C++程序中使用malloc(),除非需要传递将由 C 代码管理的数据
  2. 您应该使用特殊的数据结构(如std::string等)来管理您的数据。
  3. 如果仍需要分配动态内存,请使用智能指针。

如果有任何内存泄漏,我应该如何调试?

您首先不会创建它们。例如,你怎么能写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();