构造向量 C++ 后无法释放指针

unable to free pointer after constructing a vector c++

我需要从另一个函数获得的 char** 变量填充向量变量。

我自己尝试了以下程序:

#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;
char** getS();
int main()
{
    int i;
    vector<string> a;
    cout << "Hello World" << endl; 
    char** b=getS(); 
    char c[][5] = {"one","two","thr"};


    //a.insert(a.begin(), b, b+3);

    for(i=0;i<3; i++)
    {
        a.push_back(b[i]);
    }


    for(i=0;i<3; i++) 
        free(b[i] );

    free(b); 

    for(i=0;i<3; i++)
    {
        cout <<a[i].c_str() << endl; 
    }
    return 0;
}

char** getS()
{
    char** list; 
    int number_of_row=3,number_of_col =5,i;
    list = (char**)malloc(sizeof(char*)*number_of_row);
    for(i=0;i<number_of_row; i++) 
    {
        list[i] =(char*) malloc(sizeof(char)*number_of_col);  
        list[i] ="Hello";
    }

    return list;
}

我尝试在 this site 中执行它。

我在控制台中收到无效指针错误和转储。 但我相信在将值推入向量后,可以像我上面所做的那样释放指针。 如果我删除指针 b 的释放,那么代码工作正常。

我需要在释放填充它的原始 char** 变量后使用该向量。

char** 中字符串数组的长度在我的示例中是硬编码的。

问题出在这一行:

list[i] ="Hello";

这不会将字符串复制到您分配的内存中,它会覆盖指针。在该语句之后,您丢失了分配的指针,而是指向一个字符串文字(由编译器静态分配,不应由您释放)。如果你坚持使用字符指针,你应该使用 std::strcpy 来复制字符串内容。


但是,您是用 C++ 编程的,为什么还要为指针烦恼呢?你有 std::vector, you have std::string,在你的程序中使用它们,你不会有这样的问题。