try catch对char **返回值有影响

时间:2013-03-01 17:26:30

标签: c++ char return try-catch

char **test()
{
    char *a[3];
    a[0] = (char *) malloc(sizeof(char) *3);
    a[1] = (char *) malloc(sizeof(char) *3);
    a[0] = "aa";
    a[1] = "bb";
    return a;
}   

//main
try{
    char **  a;
    a = test();
    cout << a[0] << " " << a[1];
}
catch(std::exception){}

在vs2008中编译,这个程序无法输出&#34; bb&#34;,但在我删除了try catch块之后,结果却是&#34; aa bb&#34;这是真的。原因和解决方案?

2 个答案:

答案 0 :(得分:3)

此程序具有未定义的行为,因为您正在返回指向本地的指针。您需要使用a分配malloc数组以解决问题:

char **test() {
    char **a = (char**)malloc(sizeof(char*) * 2);
    a[0] = (char *) malloc(sizeof(char) *3);
    a[1] = (char *) malloc(sizeof(char) *3);
    strcpy(a[0], "aa");
    strcpy(a[1], "bb");
    return a;
}

当然,现在你完全有责任释放malloc中所有main - 内存,以避免内存泄漏(你已经在实施时已经处于困境;现在你只需要需要将第三个free添加到调用者。)

您看到的差异很可能是由于使用和不使用try / catch块的堆栈管理的差异。看来如果没有try / catch,本地的数据仍可供您打印,即使在返回test()函数后引用它也不再合法。< / p>

答案 1 :(得分:0)

问题1:返回指向本地数组的指针。当函数返回时会被破坏,并且在此之后使用指针会产生未定义的行为。

问题2:显式内存管理,并使用指向字符串文字的指针覆盖指向已分配内存的指针。你分配的内存泄露了;如果你试图修改文字,你会得到更多未定义的行为。

假设您正在编写C ++而不是C,以下内容将解决这两个问题:

std::vector<std::string> test() {return {"aa", "bb"};}