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;