C++中如何填充shared_ptr?三角网格类赋值报错求助
直接用vertexData_[0]赋值出错的核心原因是:你的std::shared_ptr<T>对象还没有指向一块有效的连续内存空间,空指针或未初始化的shared_ptr直接下标访问会触发未定义行为(比如程序崩溃、内存访问错误)。以下是正确的填充步骤:
1. 先为shared_ptr分配足够的内存
你需要根据顶点数据的数量,让vertexData_指向一块能容纳所有数据的数组内存,分两种场景处理:
场景1:使用C++20及以上版本
可以直接用std::make_shared创建数组,语法简洁且安全:
// 示例:假设需要存储100个顶点,T为你的顶点数据类型(如glm::vec3) size_t vertexCount = 100; vertexData_ = std::make_shared<T[]>(vertexCount);
场景2:兼容C++20之前的版本
旧标准中std::make_shared不支持数组,需要手动用new分配内存,并指定数组专用的删除器(避免内存泄漏):
size_t vertexCount = 100; // 绑定数组内存到shared_ptr,同时指定数组删除器 vertexData_ = std::shared_ptr<T>(new T[vertexCount], std::default_delete<T[]>());
2. 为内存空间填充数据
当vertexData_指向有效内存后,就可以通过下标正常赋值了:
// 示例:为第一个顶点赋值 vertexData_[0] = T{1.0f, 0.0f, 0.0f}; // 循环填充所有顶点 for (size_t i = 0; i < vertexCount; ++i) { vertexData_[i] = 你的顶点数据; // 替换为实际的顶点数据逻辑 }
额外注意事项
- 每次访问前可以先判断
vertexData_ != nullptr,避免空指针访问错误。 - 顶点数量必须在分配内存前确定(比如从.obj文件读取顶点总数后再分配),防止内存越界。
- 如果需要更灵活的内存管理,也可以先使用
std::vector<T>存储顶点数据,再将数据复制到shared_ptr指向的内存中:
std::vector<T> tempVertices(vertexCount); // 先填充tempVertices... // C++20+:复制vector数据到shared_ptr数组 vertexData_ = std::make_shared<T[]>(vertexCount); std::copy(tempVertices.begin(), tempVertices.end(), vertexData_.get());
内容的提问来源于stack exchange,提问作者merovingian
相关产品推荐
相关产品推荐

