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

通过类指针从函数返回二维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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 02:30:59