为了完成前面的有效答案,我将尝试扩展答案:
我做对了吗?
好吧,为了在函数之间传递数据:是的,使用指针是一种选择。但是社区通常不鼓励它,因为它给内存管理带来了麻烦。
当您使用指向动态内存的指针时,您必须清楚地了解创建内存的位置和删除内存的位置,换句话说:内存的生命周期必须清晰明了,因此,通常不鼓励在函数之间传递指针。
例如,在您的情况下:unsigned int* step1(...)
函数返回一个指针,但看着它,新程序员或与您一起工作的人不会知道返回的指针是否是动态内存,如果调用 step1 必须delete
或调用delete []
后的内存,同样会unsigned char* step2(unsigned int* savedData, ...)
更令人困惑和麻烦,因为有人会问:step2
会改变savedData
过去吗?
为了解决此step2
问题,您可以将功能更改为:
unsigned char* step2(const unsigned int* const savedData, ...)
通过添加const
您正在告诉:“嘿!step2
不会更改内容,savedData
也不会更改它指向的地址”。
但是前面所有的文字都没有用,因为没有解决最重要的问题:内存在哪里被释放?
在step1
您动态创建内存中,在step2
此内存中已读取但...delete
隐藏在您未粘贴的代码中的某处?还是有一个step3
等待照顾的记忆?
为了避免所有这些内存问题,通常建议使用 STL 容器,例如std::vector
,容器会为您处理内存管理,在您的情况下:
typedef std::vector<int> intvector;
typedef std::vector<intvector> intintvector;
void step1(intintvector &Data, ...) {
...
// create data arrays
intvector data0, data1, data2, data3;
// fill data0, data1, data2, data3
// ...
// save data arrays.
Data.push_back(data0);
Data.push_back(data1);
Data.push_back(data2);
Data.push_back(data3);
}
void step2(const intintvector &savedData, ...) {
// read data arrays
intvector data0 = savedData[0];
intvector data1 = savedData[1];
intvector data2 = savedData[2];
intvector data3 = savedData[3];
// ...
}
简而言之:如果您不处理动态内存,您就没有正确使用指针部分,因此,您必须解决此问题或委托给 STL 容器。
希望能帮助到你!:D