[英]Memory management in C++?
我正在开发一种简单的车辆路径问题算法,但是内存管理方面存在一些问题。 所以我有以下课程
在此,我存储订单的数据
Order::Order(int id, int idLoc, double xCoord, double yCoord, double demand, int startTime, int endTime, int serviceTime) {
this->id = id;
this->idLoc = idLoc;
this->xCoord = xCoord;
this->yCoord = yCoord;
this->demand = demand;
this->startTime = startTime;
this->endTime = endTime;
this->serviceTime = serviceTime;
}
Order::~Order() {
// TODO Auto-generated destructor stub
}
在此文件中,我存储了一系列订单,这些订单代表了在分发过程中要服务的一系列客户。
Route::Route(int idRoute,Vehicle *vehicleRoute) {
id = idRoute;
vehicle = vehicleRoute;
demandRoute = -1;
serviceTimeRoute =-1;
earliestTimeRoute =-1;
latestTimeRoute = -1;
serviceDistanceRoute = -1;
orders = new std::deque<Order>;
}
Route::Route(int idRoute, std::deque<Vehicle>::iterator vehicleIterator) {
id = idRoute;
vehicle = &(*vehicleIterator);
demandRoute = -1;
serviceTimeRoute =-1;
earliestTimeRoute =-1;
latestTimeRoute = -1;
serviceDistanceRoute = -1;
orders = new std::deque<Order>;
}
Route::~Route() {
std::cout << "Destroying Route " << id << std::endl;
delete orders;
std::cout << "Route Destroyed" << std::endl;
}
最后,我在这里存储了一组路线。
Solution::Solution() {
solution = new std::deque<Route>;
}
Solution::~Solution() {
std::cout << "Destroying Solution" << std::endl;
delete solution;
std::cout << "Solution Destroyed" << std::endl;
}
问题在这里:
readCustomers(&orderList, &depotList);
readVehicles(&vehicleList);
std::deque<Vehicle>::iterator it = vehicleList.getVehicleList()->begin();
int routeID = 0;
Route route (routeID, it);
solution.getSolution()->push_back(route); //Problem
因此,我阅读了“订单和车辆”,然后创建了尚未关联任何“订单”的Route路线,最后将此路线添加到解决方案中。
当我编译这段代码时,我得到以下输出:
Route address: 0x7fff7351e110
Solution's route address: 0x1ab8270
Destroying Route 0
Route Destroyed
Destroying Solution
Destroying Route 0
Route Destroyed
Solution Destroyed
*** Error in `/home/.../': corrupted double-linked list: 0x0000000001ab5800 ***
使用valgrind收集有关此错误的更多信息,得到以下消息:
IVR [1]: Invalid read of size 8
IVF [1]: Invalid free()/delete/delete[]/realloc()
我想我要释放两次相同的内存。 但是我看不到哪里。 谁能帮我这个忙。
在std :: deque中使用时,路由对象将被复制。
我看不到“复制”运算符,您分配了新的订单。 现在复制路径时,指针也被复制。 因此,您有两个对象指向同一对象并释放相同的内存。
您为什么在这里使用new和delete。 直接将std :: deque嵌入为成员,并避免使用new / delete。
如果需要新的/删除的:
如果决定将其添加为成员,则需要在类中声明它:
class Route ...
{
...
std::deque<Order> orders;
完全不需要新的删除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.