C++ 取消引用指向矢量的空指针时的分段错误
C++ Segmentation fault while dereferencing a void pointer to a 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 okn";
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 findn";
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;
}
我想要实现的是编写一个简单的发布/订阅(如 ROS(系统,我使用 void 指针,以便它适用于所有数据类型。这是简化的代码。
如果我发布一个 int,它可以正常工作,但真正让我困惑的是:
- 如果我传递一个长向量(如此代码(,它给了我 ">分段错误(核心转储("错误。
- 如果我定义"寄存器"和"发布"之间的向量(即像 注释部分(,此错误消失。
- 如果我使用较短的向量,例如大小为 10,无论我在哪里定义 它,我的代码运行流畅。
我在Linux中使用g++。
请帮我修复我的代码并解释为什么会发生上述行为,提前感谢!
您不能复制std::vector
或任何其他类似的非平凡类型。在对这样的对象做任何事情(甚至是赋值到(之前,你需要使用构造函数和放置 new来构造它。
一种方法是
new(msgtable[i].vpData) T;
在register
函数中执行此操作。
然后,您可以像这样分配一个值。
更好的是,根本不要使用malloc
,使用(正常,非放置(new
分配对象。
但是,我强烈建议放弃void*
并转向基于模板的STRU_Msg
实现。如果您不想重新发明轮子,只需使用std::any
.
相关文章:
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 运行时错误:引用绑定到类型为"int"的空指针
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 为什么我在空指针错误(链表)中获取成员访问权限
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 成员访问是否在空指针上定义C++?
- 尝试将对象插入空指针数组时出现分段错误
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 是否允许向空指针添加零?
- 为什么 C 样式字符串的工作空指针检查不?
- 在函数内初始化无符号字符指针将返回空指针
- 为什么多维数组中的空字符串文本衰减为空指针?
- C++ 取消引用指向矢量的空指针时的分段错误
- 错误 C6011:取消引用空指针"NAME"。C++
- cppcheck取消引用空指针
- 打印空指针时,std::cout 可以打印 "NULL" 而不是 0 吗?
- 递增空指针无法正确设置值
- Qt - 将空指针(原始数据)转换为 QImage 并将其显示在标签上
- 当我尝试空指针时出现分段错误