我已经编程不好了很长一段时间,我只是真的意识到.我以前创建了许多函数,它们将字符串作为char数组返回(或至少指向它们的指针).
有一天有人指出,当我的函数返回我的函数指向的char数组已经超出范围,我基本上现在指向一个随机的内存(一个讨厌的悬挂指针).
我没有真的注意到这一段时间,因为在输出到控制台时的字符数组似乎没有被破坏(可能是因为没有时间覆盖该数据).当我返回通过读取经常损坏的串行端口生成的字符串缓冲区(char数组)时,我注意到这一点.
那么,我应该怎么做呢?
#include <cstdlib> #include <iostream> using namespace std; char* myBadFunction(){ char charArray[] = "Some string\n"; char* charPointer = charArray; return charPointer; } int main(int argc,char** argv) { cout << myBadFunction(); return 0; }
我明白,在调用该函数或创建一个全局变量以将返回的字符串放入之前,我应该在程序中分配内存,但是如果我的被调用的函数被许多不同的程序使用,那么应该如何知道要传递的缓冲区的大小提前进入,什么时候应该删除这个记忆?
以下代码也不会做我想要的:
#include <cstdlib> #include <iostream> using namespace std; void fillArray(char* charPointer){ char charArray[] = "Some string\n"; // Create string charPointer = charArray; // Not correct,want to fill predefined array with created string return; } int main(int argc,char** argv) { char predefinedArray[50] = {0}; fillArray(predefinedArray); cout << predefinedArray; return 0; }
我想填充指针解析点的数组,但这不会发生在上面的代码中.
另外,什么时候应该使用new []命令创建我的数组?是否需要?我什么时候应该在其上调用delete [].
非常感谢这一点,它显然是非常根本的,但是我一直在做错了一段时间.
解决方法
最简单的方法是返回一个std :: string,如果你需要访问内部char数组,使用std :: string :: c_str().
#include <iostream> #include <string> using namespace std; string myGoodFunction(){ char charArray[] = "Some string\n"; return string(charArray); } int main(int argc,char** argv) { cout << myGoodFunction(); return 0; }
如果您需要返回除char数组以外的内容,请记住指针可以用作迭代器.这允许您将数组封装在向量或类似结构中:
vector<int> returnInts() { int someNums[] = { 1,2,3,4 }; return vector<int>(someNums,someNums + 4); }