use*_*395 -1 c++ memory-leaks memory-management
我正在开发一个简单的车辆路径问题算法,我对内存管理有一点问题.所以我有以下课程
在这一个我存储订单的数据
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
}
Run Code Online (Sandbox Code Playgroud)
在这一个中,我存储了一个订单列表,这些订单代表了在分发期间服务的一系列客户.
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;
}
Run Code Online (Sandbox Code Playgroud)
最后,这里我存储了一组路线.
Solution::Solution() {
solution = new std::deque<Route>;
}
Solution::~Solution() {
std::cout << "Destroying Solution" << std::endl;
delete solution;
std::cout << "Solution Destroyed" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
问题出在这里:
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
Run Code Online (Sandbox Code Playgroud)
所以我读了订单和车辆,然后我创建了没有订单关联的路线,最后我将这条路线添加到解决方案中.
当我编译这段代码时,我得到以下输出:
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 ***
Run Code Online (Sandbox Code Playgroud)
使用valgrind收集有关此错误的更多信息,获得以下消息:
IVR [1]: Invalid read of size 8
IVF [1]: Invalid free()/delete/delete[]/realloc()
Run Code Online (Sandbox Code Playgroud)
我想我两次释放相同的内存.但我没有看到哪里.任何人都可以帮助我这个.
在std :: deque中使用时,路径对象会被复制.
我看不到复制操作符,您使用new分配订单.现在复制Route时,也会复制指针.所以你有两个对象指向同一个对象并释放相同的内存.
你为什么在这里使用new和delete.将std :: deque直接嵌入为成员并避免新建/删除.
如果您需要新/删除:
如果您决定将其添加为成员,则需要在类中声明它:
class Route ...
{
...
std::deque<Order> orders;
Run Code Online (Sandbox Code Playgroud)
根本不需要新的删除.
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |