C++ 通过函数后为空字符串
我在数组的第一个元素(“”)上得到一个空字符串,而其他元素是正确的。似乎字符串对象在退出函数后立即被销毁。它与悬空指针无关吗? 如何解决C++ 通过函数后为空字符串,c++,arrays,string,C++,Arrays,String,我在数组的第一个元素(“”)上得到一个空字符串,而其他元素是正确的。似乎字符串对象在退出函数后立即被销毁。它与悬空指针无关吗? 如何解决 void func(const char**&ptr) { std::string errorstring = "Test1"; ptr = (const char **)malloc(5 * sizeof(const char *)); ptr[0] = errorstring.c_str(); p
void func(const char**&ptr)
{
std::string errorstring = "Test1";
ptr = (const char **)malloc(5 * sizeof(const char *));
ptr[0] = errorstring.c_str();
ptr[1] = "Test2";
ptr[2] = "Test3";
ptr[3] = "Test4";
ptr[4] = "Test5";
}
谢谢
ptr[0]
设置为指向由errorstring
管理的缓冲区。当函数返回时,errorstring
超出范围并被销毁,从而取消分配该缓冲区ptr[0]
成为一个悬空指针。调用者取消引用的任何尝试都将显示未定义的行为。ptr[0]
设置为指向由errorstring
管理的缓冲区。当函数返回时,errorstring
超出范围并被销毁,从而取消分配该缓冲区ptr[0]
成为一个悬空指针。调用者任何试图取消引用它的行为都将显示未定义的行为。当您键入“Text1”
时,将在某个位置分配一个字符数组。
当您键入std::string errorstring=“Test1”
,然后将使用此数组初始化errorstring
,它不仅会引用它,还会将整个字符数组-“Text1”
复制到自己的内存中。在func
的末尾,将自动调用errorstring
的析构函数,它将释放自己的内存,使返回的.c_str()
无效。因此,ptr[0]
成为一个悬空指针。错误的想法是,errorstring
与“Test1”相同(只是对“Test1”的引用),因为=
符号。但是C++中的errorstring
是一个完全不同于“Test1”
的对象,当您键入“Text1”
时,将在某个位置分配一个字符数组。
当您键入
std::string errorstring=“Test1”
,然后将使用此数组初始化errorstring
,它不仅会引用它,还会将整个字符数组-“Text1”
复制到自己的内存中。在func
的末尾,将自动调用errorstring
的析构函数,它将释放自己的内存,使返回的.c_str()
无效。因此,ptr[0]
成为一个悬空指针。错误的想法是,errorstring
与“Test1”相同(只是对“Test1”的引用),因为=
符号。但是C++中的errorstring
是一个与“Test1”
完全不同的对象。对2.是的,3。做点别的。现代C++代码不需要MALOC或任何新的东西。专注于摆脱任何你认为你需要去malloc或新事物的原因。这和悬空指针无关吗?是的,这正是你分配给<代码> PTR [0 ] < /COD> -一个悬空指针。<代码> STD::向量< /代码>——这就是你在现代C++中使用的,而不是三指针。谢谢PaulMcKenzie。我会试试这个策略。似乎我还没有升级到新的非托管函数。通常,我都是管理型的。对2.是的,3。做点别的。现代C++代码不需要MALOC或任何新的东西。专注于摆脱任何你认为你需要去malloc或新事物的原因。这和悬空指针无关吗?是的,这正是你分配给<代码> PTR [0 ] < /COD> -一个悬空指针。<代码> STD::向量< /代码>——这就是你在现代C++中使用的,而不是三指针。谢谢PaulMcKenzie。我会试试这个策略。似乎我还没有升级到新的非托管函数。通常情况下,我是被管理者。