C++ 为空字符赋值*
在以下代码中:C++ 为空字符赋值*,c++,C++,在以下代码中: const char * my_func1(char const *str) { const char *a = func(); // returns a char *, but I guess its ok to assign non-const to const if(a == NULL) { MY_String b = str; //MY_String is an inhouse class with string func
const char * my_func1(char const *str)
{
const char *a = func(); // returns a char *, but I guess its ok to assign non-const to const
if(a == NULL)
{
MY_String b = str; //MY_String is an inhouse class with string functions
b.replace("\"", "\'"); //replace " with '
a = (const char *)b; //MY_string has an operator (const char *)
}
return a;
}
我遇到的问题是,当
a
为null
时,它进入if
块,对a
的赋值工作不正常,我收到垃圾。是因为a
为null
所以我不能给它赋值吗?如何修复此问题?我不知道我的字符串是什么。但不管它是什么,它是一个局部变量。因此,它在if
块的末尾超出了范围。所以不管它的操作符const char*
做什么,一旦底层对象被破坏,它可能不会给你合理的结果
唯一可行的方法是重载运算符动态分配一个新的
char
缓冲区,并返回指向它的指针。但那太荒谬了。我不知道我的字符串是什么。但不管它是什么,它是一个局部变量。因此,它在if
块的末尾超出了范围。所以不管它的操作符const char*
做什么,一旦底层对象被破坏,它可能不会给你合理的结果
唯一可行的方法是重载运算符动态分配一个新的
char
缓冲区,并返回指向它的指针。但是那将是荒谬的。当然你可以分配给一个
,即使它是空的。您不能做的是分配给*a
b
是否为其成员使用自动存储?如果是这样,请确保您没有从转换运算符返回指向其中一个的指针,因为一旦b
超出范围,它将变得无效。当然,您可以分配给a
,即使它为空。您不能做的是分配给*a
b
是否为其成员使用自动存储?如果是这样,请确保您没有从转换运算符返回指向其中一个的指针,因为一旦b
超出范围,它将变得无效。如果看不到MY_String
的实际接口,很难判断它的行为,但我将根据您的注释来假设它的行为
它看起来像是您分配给a
在b
中分配的缓冲区。但是,b
在if块的末尾被禁用。所以b
被破坏了,他的缓冲区也被破坏了(我想)
这就解释了为什么你的
a
指向垃圾。如果没有看到MY_String
的实际接口,很难判断,但我会根据你的评论来假设它的行为
它看起来像是您分配给a
在b
中分配的缓冲区。但是,b
在if块的末尾被禁用。所以b
被破坏了,他的缓冲区也被破坏了(我想)
这可以解释为什么
a
指向垃圾。那么,b
不再在if
块之外的范围内。要修复它,首先需要为a
分配一些内存(使用new
)。但是,这并不是非常类似C++,而且很容易导致内存泄漏并将整个腿都吹断。 ,<>代码> b>代码>如果<<代码>块,则不再在<代码>范围之外。要修复它,首先需要为
a
分配一些内存(使用new
)。这不是非常类似C++的,而且你很容易造成内存泄漏并把你的整个腿都吹断。你如何确定“Ato的分配不正常”?还有,什么是MY_String
?您的代码非常不透明。我们不知道func
做什么或MY_String
是什么,replace
方法实际做什么,cast操作符做什么,等等。另外,如果MY_String
管理它自己的内存,你会返回一个指向delete[]
ed内存块的指针。@Oli Charlesworth这是因为,我可以在调试器中运行它,并在“returna”处停止,然后看到a有垃圾。。但是在阅读了评论之后,我觉得任务是有效的,但是在if阻塞之后超出了范围。您如何确定“对a的任务工作不正常”?还有,什么是MY_String
?您的代码非常不透明。我们不知道func
做什么或MY_String
是什么,replace
方法实际做什么,cast操作符做什么,等等。另外,如果MY_String
管理它自己的内存,你会返回一个指向delete[]
ed内存块的指针。@Oli Charlesworth这是因为,我可以在调试器中运行它,并在“returna”处停止,然后看到a有垃圾。。但是在阅读了评论之后,我觉得作业是有效的,但是在if阻止之后超出了范围。所以你的回答是有意义的,我如何避免这一点呢?我的字符串是一个字符串类。我使用它的唯一原因是使用replace函数。我既不能使用该类,也不能手动在上执行搜索和替换。@tryurbest:一个可能的修复方法是从myfunc1
返回std::string
或myu string
,而不是const char*
。另一种方法是使用strdup((const char*)b)或类似方法获取要返回的字符串数据的副本,并确保调用者将其释放(这意味着当您返回a
未更改时,您也必须复制该数据)。另一种方法是让调用方传入另一个参数,一个指向可写缓冲区的指针,其长度足以包含结果数据(如果可以预测的话)。将字符串数据复制到其中,而不是返回指针。到目前为止,最简单的方法是返回std::string
。因此,您的回答是有意义的,但是如何避免这种情况?我的字符串是一个字符串类。我使用它的唯一原因是使用replace函数。我不能使用该类,也不能手动在上执行搜索和替换。@tryurbest:一个可能的修复方法是从MY\u func1
返回std::string
或MY\u string