C++ C++;取消引用指向向量的空指针时出现分段错误 #包括 #包括 #包括 STRU_Msg结构 { std::字符串名; void*vpData; }; CMSG类 { 公众: 模板 int miRegister(标准::字符串名称) { 味精; msg.name=名称; msg.vpData=malloc(sizeof(T)); msgtable.向后推(msg); std::cout
您不能复制C++ C++;取消引用指向向量的空指针时出现分段错误 #包括 #包括 #包括 STRU_Msg结构 { std::字符串名; void*vpData; }; CMSG类 { 公众: 模板 int miRegister(标准::字符串名称) { 味精; msg.name=名称; msg.vpData=malloc(sizeof(T)); msgtable.向后推(msg); std::cout,c++,c++11,vector,void-pointers,C++,C++11,Vector,Void Pointers,您不能复制std::vector或任何其他类似的非平凡类型。在对此类对象执行任何操作(甚至赋值)之前,您需要使用构造函数和新位置来构造它 这样做的一个方法是 #include <iostream> #include <vector> #include <mutex> struct STRU_Msg { std::string name; void *vpData; }; class CMSG { public: template &
std::vector
或任何其他类似的非平凡类型。在对此类对象执行任何操作(甚至赋值)之前,您需要使用构造函数和新位置来构造它
这样做的一个方法是
#include <iostream>
#include <vector>
#include <mutex>
struct STRU_Msg
{
std::string name;
void *vpData;
};
class CMSG
{
public:
template <typename T>
int miRegister(std::string name)
{
STRU_Msg msg;
msg.name = name;
msg.vpData = malloc(sizeof(T));
msgtable.push_back(msg);
std::cout << "registeratio ok\n";
return 0;
}
template <typename T>
int miPublish(std::string name, T tData)
{
for (int i = 0; i < msgtable.size(); i++)
{
if (!name.compare(msgtable[i].name))
{
(*(T *)msgtable[i].vpData) = tData;
std::cout << "SUccess!\n";
return 0;
}
else
{
std::cout << "cannot find\n";
return 0;
}
}
}
private:
std::vector<STRU_Msg> msgtable;
};
int main()
{
CMSG message;
std::string fancyname = "xxx";
std::vector<float> v;
// message.miRegister< std::vector<float> >(fancyname);
// for (int i = 0; i < 1000; i++)
// {
// v.push_back(i);
// }
// std::cout << "v[0]: " << v[0] << ", v[-1]: " << v[v.size()-1] << '\n';
// message.miPublish< std::vector<float> >(fancyname, v);
for (int i = 0; i < 1000; i++)
{
v.push_back(i);
}
std::cout << "v[0]: " << v[0] << ", v[-1]: " << v[v.size()-1] << '\n';
message.miRegister< std::vector<float> >(fancyname);
message.miPublish< std::vector<float> >(fancyname, v);
return 0;
}
在寄存器中执行此操作
然后,您可以像这样指定一个值
更好的是,根本不要使用malloc
,使用(正常、非放置)new
分配对象
然而,我强烈建议放弃void*
并转向基于模板的STRU-Msg
实现。如果您不想重新发明轮子,只需使用std::any
为什么不在CMSG
内部声明STRU-Msg
并使用t*tpData
而不是void*vpData
<代码> MaloC/<代码>在C++中使用的用例很少(这不是其中之一),更喜欢<代码>新< /C>……但是<代码> Value>代码>也是代码气味。代码只是每个代码变体所展示的未定义行为的一种可能输出。据我所知,您正在使用malloc
分配sizeof(std::vector)
字节的内存,然后将其转换为std::vector
(为了将另一个向量复制到其中,即调用std::vector::operator=(…)
)并期望得到合理的结果。这不起作用(它是UB),您需要实际构造第一个向量;使用new
而不是malloc
。谢谢,我将msg.vpData=malloc(sizeof(t));
更改为new(msg.vpData)T;
并保持其他内容不变,那么无论我将寄存器函数放置在何处或T是什么类型,我都会得到分段错误,请帮助!@n33您可以使用(malloc和placement new)或(非placement new代替malloc(推荐))。
new(msgtable[i].vpData) T;