dlopen 后错误的字符串库?
Wrong string library after dlopen?
我目前在模块化程序上使用 dlopen,我认为确实有问题,但我似乎无法弄清楚。
requirementData 是一个名为 VoidData 的 class 的向量。简直就是class 轻松处理void*
getCopyOfData() 使用memcpy 复制存储在void* 中的数据。直到这里一切都很好,voidptr 的地址与存储在我的 VoidData 对象中的地址不同,因此复制成功。
现在... stringA 给我正确的字符串。这对于 stringB 也是可以的。但是随后出现了 stringC,他给了我一些奇怪的东西。
void* voidptr = requirementData[0].getCopyOfData();
string stringA = *((string*) voidptr);
cout << "VoidPtr: " << stringA << endl; // VoidPtr: 'SayHey'
string stringB = *((string*) voidptr);
cout << "VoidPtr: " << stringB << endl; // VoidPtr: 'SayHey'
// load library
void *handle = dlopen("/usr/lib64/libOpcWorkingPackage.so", RTLD_LAZY);
string stringC = *((string*) voidptr);
cout << "VoidPtr: " << stringC << endl; // VoidPtr: '����'
我还尝试将 voidptr 转换为 uint8_t 的数组。每次数组给我相同的 32 个数字。
for (unsigned int i = 0; i < sizeof(stringC); i++){
cout << to_string(((uint8_t*) voidptr)[i]) << ", ";
}
cout << endl;
// 80, 181, 228, 245, 255, 127, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 83, 97, 121, 101, 119, 121, 0, 0, 0, 183, 228, 245, 255, 127, 49, 52
我没有想法,也许有人可以帮助我。
谢谢,成濑
编辑:这是我的 getCopyOfData() 函数:
void* VoidData::getCopyOfData() const {
void *data = malloc(size);
memcpy(data, storedData, size);
return data;
}
编辑:知道了
我得到的数据是一个char[]。这个 char[] 被放在一个不复制它们的字符串中,它只是在上面放一个指针。 char[]释放后,字符串一直工作到内存不再使用为止
感谢user4581301的正确思路!
我得到的数据在一个char[]中。这个 char[] 被放在一个字符串中(由我),它不会复制它们,它只是在上面放一个指针。 char[]释放后,字符串一直工作,直到内存不再被使用。
感谢user4581301的正确思路!
我目前在模块化程序上使用 dlopen,我认为确实有问题,但我似乎无法弄清楚。
requirementData 是一个名为 VoidData 的 class 的向量。简直就是class 轻松处理void*
getCopyOfData() 使用memcpy 复制存储在void* 中的数据。直到这里一切都很好,voidptr 的地址与存储在我的 VoidData 对象中的地址不同,因此复制成功。
现在... stringA 给我正确的字符串。这对于 stringB 也是可以的。但是随后出现了 stringC,他给了我一些奇怪的东西。
void* voidptr = requirementData[0].getCopyOfData();
string stringA = *((string*) voidptr);
cout << "VoidPtr: " << stringA << endl; // VoidPtr: 'SayHey'
string stringB = *((string*) voidptr);
cout << "VoidPtr: " << stringB << endl; // VoidPtr: 'SayHey'
// load library
void *handle = dlopen("/usr/lib64/libOpcWorkingPackage.so", RTLD_LAZY);
string stringC = *((string*) voidptr);
cout << "VoidPtr: " << stringC << endl; // VoidPtr: '����'
我还尝试将 voidptr 转换为 uint8_t 的数组。每次数组给我相同的 32 个数字。
for (unsigned int i = 0; i < sizeof(stringC); i++){
cout << to_string(((uint8_t*) voidptr)[i]) << ", ";
}
cout << endl;
// 80, 181, 228, 245, 255, 127, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 83, 97, 121, 101, 119, 121, 0, 0, 0, 183, 228, 245, 255, 127, 49, 52
我没有想法,也许有人可以帮助我。
谢谢,成濑
编辑:这是我的 getCopyOfData() 函数:
void* VoidData::getCopyOfData() const {
void *data = malloc(size);
memcpy(data, storedData, size);
return data;
}
编辑:知道了
我得到的数据是一个char[]。这个 char[] 被放在一个不复制它们的字符串中,它只是在上面放一个指针。 char[]释放后,字符串一直工作到内存不再使用为止
感谢user4581301的正确思路!
我得到的数据在一个char[]中。这个 char[] 被放在一个字符串中(由我),它不会复制它们,它只是在上面放一个指针。 char[]释放后,字符串一直工作,直到内存不再被使用。
感谢user4581301的正确思路!