try-catch对char**返回值有影响
try catch has an influence in char** return values
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"};}
相关文章:
- 是否有一些东西限制了未来引入多个返回值C++标准?
- 如果函数的返回值将用作右值引用而不是左值,有没有办法使函数具有不同的行为?
- 返回值是否会有临时被销毁?
- 动态指针引用数组由三元运算符返回值,但有异常
- 为什么 GCC 无法优化,除非返回值有名称?
- 有没有办法为任何函数编写通用代码,以便它可以(异步)执行并从线程池中获得返回值?
- 有条件的操作员从其参数的副本中返回值
- C - 如何编写一个函数,返回真实有价值函数的导数,而不是导数的值
- 内联函数,等于 "sizeof expression" ,但返回一个有符号值
- C++ - 在线程中使用时,将函数的返回值声明为 void/void* 之间有什么区别吗?
- 是否有一种方法可以通过C 中的OUT参数接收Python中的返回值
- 是否有任何理由将返回值捕获为rvalue参考
- 是否有C 函数的默认返回值
- memset() 返回值有什么用?
- 实现move构造函数如何影响返回值优化
- 返回值和副作用编码之间有什么区别
- 有没有办法在C++11中匹配返回值
- 在JNA中,GlobalAlloc和GlobalLock的返回值有什么不同
- 用户定义函数的返回值有问题
- try-catch对char**返回值有影响