如何解决尝试将 std::;string 设为 void* 时非法间接
我有一个库,我正在使用该库,其中函数采用 void *,但我尝试传递的文本是 std::string 类型。所以我做到了
void CastToVoid(std::string *data)
{
void *temp = *(static_cast<void*>(data));
}
我正在使用它
foregroundWindow = GetActiveWindowTitle();
CastToVoid( static_cast<std::string*>(&foregroundWindow));
Speak(&foregroundWindow); // Where speak is what takes the void*
这会产生非法的间接访问。知道为什么吗?
解决方法
由于您的 Speak(void *)
函数采用无类型/空指针,因此不清楚它期望什么样的参数。即 Speak()
是否期望其参数是指向以 NUL 结尾的字节数组的指针,还是期望其参数是指向 std::string
对象的指针?由于 void *
是无类型的,任何一个都可以编译,但传入“错误”的参数可能会导致运行时崩溃或其他未定义的行为。
也就是说,如果实现 Speak(void *)
以期望其参数指向 std::string
,那么您可以这样调用它(如上面所做的那样):
Speak(&foregroundWindow);
或者如果 Speak(void *)
被实现为期望它的参数是一个指向 NUL 终止的字符数组的指针,你可以这样调用它:
Speak(const_cast<void *>(foregroundWindow.c_str()));
不过,最好的方法是修改 Speak()
方法的参数类型以指定它所采用的指针的类型,而不是接受 void *
,以便编译器可以标记当程序员传入不适当的值时出现错误,而不是允许编程错误未被检测到并导致运行时故障。所以像:
void Speak(std::string * pointerToStdString);
或者更好(如果 Speak() 不需要修改 std::string
):
void Speak(const std::string * pointerToStdString);
或(如果 Speak() 只需要指向 NUL 终止字符数组的指针)
void Speak(const char * pointerToChars);
,
std::string
是一个容器对象,它保存有关字符串的信息。在引擎盖下,它看起来像这样(只是为了解释),
class string {
public:
string() {}
...
// Other member functions.
private:
char* pData = nullptr;
};
如您所见,std::string
本身不是字符串类型(意味着 std::string
不是 " "
)。因此,将其转换为 void*
将导致未定义的行为。
如果您的目标是将字符串数据作为 void*
传递,则使用 std::string::c_str()
将实际字符串数据作为 const char*
获取。这样你就可以将字符串传递给你想要的函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。