Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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+中指针的STL列表+;_C++_List_Pointers_Stl - Fatal编程技术网

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

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分配的内存??请参阅我的内联注释

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
,然后在下一行将其释放。因此:

  • 在C++程序中不应使用<代码> MARROCK()/CUT>除非您需要传递由C代码
  • 管理的数据
  • 您应该使用特殊的数据结构,如
    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();