通过类指针从函数返回二维Vector时程序崩溃问题排查
问题:二维Vector传递导致程序崩溃,寻求精简内存高效方案
我遇到的问题似曾相识,查过类似案例,现在要找更精简的解决方案。
我正在开发一款能生成像素风格动画猫和其他动物的游戏,这些动物是会在玩家身边生成的宠物。用Meow类存储猫的精灵数据,通过类指针把数据传给favorite_pet::initialize()来加载宠物精灵数据。
程序在执行这段代码时崩溃:
vec_cat_data_input_2D = point_kitty->cat_data(vec_cat_sprite_ids);
但用一维Vector和变量做相同操作却完全正常:
vec_cat_data_input_1D = point_kitty->cat_data(variable_cat_sprite_ids); // 没问题!
接收的二维Vector尺寸(行/列)不固定,这个结构会作为一组非数据持有类子类的原型。宠物类继承了物理和API图像控制功能,所以我不想把数据存在控制游戏精灵的对象里。
我不想创建大量指针来提前预估(n,m)尺寸,也希望避免不必要的内存分配、指针清理或全局数据,要找更内存高效的方案。我确实是用ClassObject* point_blah;这种方式调用函数,而非直接调用对象。
相关代码
main函数代码
#include "favorite_pet.h" void main() { favorite_pet NewPet; NewPet.initialize(); }
favorite_pet.h
#pragma once // favorite_pet.h #include "meow.h" class favorite_pet { private: Meow* point_kitty; // 不想为了预估(n,m)尺寸额外创建两个指针... std::vector<std::vector<float>> vec_cat_data_input_2D; public: // 构造函数 favorite_pet(); void initialize(); std::vector<int> vec_cat_sprite_ids; };
favorite_pet.cpp
#include "favorite_pet.h" // 默认构造函数 favorite_pet::favorite_pet() { point_kitty = new Meow(); } void favorite_pet::initialize() { // 一些随机值 vec_cat_sprite_ids.push_back(0); vec_cat_sprite_ids.push_back(1); vec_cat_sprite_ids.push_back(2); // 从非父类/友元的其他类获取数据 vec_cat_data_input_2D = point_kitty->cat_data(vec_cat_sprite_ids); // 其他操作 // ... delete point_kitty; point_kitty = NULL; }
meow.h
#pragma once // meow.h #include <vector> class Meow { private: public: // 构造函数 Meow(); std::vector<std::vector<float>> cat_data(std::vector<int>&); std::vector<std::vector<float>> vector_cat { { 0, 1, 2, 3, 4}, { 5, 6, 7, 8, 9}, { 10, 11, 12, 13, 14}, { 15, 16, 17, 18, 19} }; std::vector<std::vector<float>> vec_cat_sprite_data_output_2D; };
meow.cpp
#include "meow.h" #include <vector> Meow::Meow() { } std::vector<std::vector<float>> Meow::cat_data(std::vector<int>& vec_id_list) { for (int var_incoming_list = 0; var_incoming_list < vec_id_list.size(); var_incoming_list++) { vec_cat_sprite_data_output_2D.emplace_back(); for (int var_output = 0; var_output < vec_id_list.size(); var_output++) { vec_cat_sprite_data_output_2D[var_output].push_back(vector_cat[vec_id_list[var_incoming_list]][var_output]); } } return vec_cat_sprite_data_output_2D; }
内容的提问来源于stack exchange,提问作者maninthemiddle
相关产品推荐
相关产品推荐

