【发布时间】:2023-04-10 16:10:01
【问题描述】:
[编辑] 在这个 get 方法之外(见下文),我想要一个指针 double * result; 然后调用 get 方法,即
// Pull results out
int story = 3;
double * data;
int len;
m_Scene->GetSectionStoryGrid_m(story, data, len);
话虽如此,我想要一个 get 方法,它通过引用简单地设置结果 (*&data),而不是动态分配内存。
我正在寻找的结果已经存在于内存中,但它们在 C 结构中并且不在一个连续的内存块中。仅供参考,&len 只是数组的长度。我想要一个包含所有结果的大数组。
由于我要查找的实际结果存储在本机 C 结构指针 story_ptr->int_hv[i].ab.center.x; 中。我将如何避免像上面那样动态分配内存?我想将数据*指向结果,但我只是不知道该怎么做。可能是我忽略了一些简单的东西……代码如下。
这甚至可能吗?根据我的阅读,它不是,但正如我的用户名所暗示的那样,我不是软件开发人员。感谢所有到目前为止回复的人!
这是一段sn-p代码:
void GetSectionStoryGrid_m( int story_number, double *&data, int &len )
{
std::stringstream LogMessage;
if (!ValidateStoryNumber(story_number))
{
data = NULL;
len = -1;
}
else
{
// Check to see if we already retrieved this result
if ( m_dStoryNum_To_GridMap_m.find(story_number) == m_dStoryNum_To_GridMap_m.end() )
{
data = new double[GetSectionNumInternalHazardVolumes()*3];
len = GetSectionNumInternalHazardVolumes()*3;
Story * story_ptr = m_StoriesInSection.at(story_number-1);
int counter = 0; // counts the current int hv number we are on
for ( int i = 0; i < GetSectionNumInternalHazardVolumes() && story_ptr->int_hv != NULL; i++ )
{
data[0 + counter] = story_ptr->int_hv[i].ab.center.x;
data[1 + counter] = story_ptr->int_hv[i].ab.center.y;
data[2 + counter] = story_ptr->int_hv[i].ab.center.z;
m_dStoryNum_To_GridMap_m.insert( std::pair<int, double*>(story_number,data));
counter += 3;
}
}
else
{
data = m_dStoryNum_To_GridMap_m.find(story_number)->second;
len = GetSectionNumInternalHazardVolumes()*3;
}
}
}
【问题讨论】:
-
它实际上是动态分配(即可变大小的数据,可能存储在堆上)你想避免吗?还是您要避免的手动内存管理(即使用
new/delete,以及内存泄漏和悬空指针的高风险)?第一个不一定要伴随第二个。 -
嗨,本杰明,我正试图避免这两种情况。我知道我想要的数据在内存中的某个地方(在 C 结构中),所以理想情况下,我想要一个指向该数据的指针并使用它。我想我主要担心内存不足(这个项目非常大),所以我想避免创建内存中已有内容的副本(避免新建/删除)。
-
我不太确定我得到了你想要的,但听起来你需要一个迭代器类。您可以返回的东西,客户端可以将其视为指针,但在迭代器中,它包含用于查找和返回值的数据和代码。
-
我试图通过编辑上面的帖子来澄清我的问题。我不确定我想要什么是可能的。看起来我必须分配内存,因为我绝对需要返回一个双精度数组。
-
如果您无法更改要返回的类型,我怀疑是否有任何方法可以避免将存储的值重新组织到另一个数组中。
标签: c++ c memory memory-management