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

try catch has an influence in char** return values

本文关键字:返回值 有影响 char try-catch      更新时间:2023-10-16
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中编译,未能输出"bb",但在我删除try-catch块后,结果是"aa-bb",这是真的。原因和解决方案?

这个程序有未定义的行为,因为您正在返回一个指向本地的指针。您需要将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;
}

当然,现在您要完全负责释放main中所有malloc的内存,以避免内存泄漏(您的实现已经为此付出了代价;现在您只需要向调用方添加第三个free(。

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

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

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

假设你写的是C++,而不是C,下面的方法可以解决这两个问题:

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