You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中如何填充shared_ptr?三角网格类赋值报错求助

正确填充std::shared_ptr类型的vertexData_成员

直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:42:04