【发布时间】:2016-08-19 01:27:55
【问题描述】:
我正在编写一个执行差分进化的程序。有一次,我将我的解决方案整理成一个解决方案档案,并遇到了这个问题。我的存档是一个结构向量:
std::vector<SingleSolution> archive;
typedef struct SingleSolution
{
int *crop_area;
int *envf;
double nr_cost;
int env_cost;
int front;
int feasible;
} SingleSolution;
当我进行排序并有一个解决方案想要放入我的存档时,我正在创建一个 SingleSolution 并将其推送到存档:
SingleSolution member;
member.crop_area = (int *)calloc(crops + 1, sizeof(int));
member.envf = (int *)calloc(M + 1, sizeof(int));
member.front = 1;
member.feasible = feasible[member1];
member.nr_cost = nr_costs[member1];
member.env_cost = env_costs[member1];
for (int n = 1; n <= crops; n++) member.crop_area[n] = solution_crop[member1][n];
for (int n = 1; n <= M; n++) member.envf[n] = solution_env[member1][n];
archive.push_back(member);
//free(member.crop_area);
//free(member.envf);
我在推入向量后释放了这些数组,因为我认为它复制了我推入的内容,但在打印存档时,我看到了明显是垃圾值的内容并意识到了原因。如您所见,我已将其注释掉。 所以我的问题是,那个 push_back 到底发生了什么?它推动了内存中数组开始的位置,然后我释放了那个空间?有什么办法可以克服这个问题,还是需要在主函数中创建空间并在调用排序函数时将其传递,然后在完成时释放它?
【问题讨论】:
-
如果您使用的是 c++,则无需自己处理原始指针。事实上,它实际上很气馁,你应该立即停止它!
-
一个指针的副本,是另一个指向同一个位置的指针。您应该将
crop_area和envf设为向量 -
您已经知道如何使用
std::vector来存储您的SingleSolution实例。它也非常适合存储crop_area和envf信息。不要为难自己。 -
我意识到这是迂腐的,但是您创建的结构不包含数组,它包含指针。包含一个数组就像
int foo[30];。请更正问题标题。此外,在惯用 C++ 中进行这项工作的方法是为您的结构定义析构函数和复制构造函数(可能还有赋值操作和移动构造函数等)(或使用像向量这样的容器来为您处理这一切)..