C++中的内存管理?

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)

我想我两次释放相同的内存.但我没有看到哪里.任何人都可以帮助我这个.

xMR*_*MRi 5

在std :: deque中使用时,路径对象会被复制.

我看不到复制操作符,您使用new分配订单.现在复制Route时,也会复制指针.所以你有两个对象指向同一个对象并释放相同的内存.

你为什么在这里使用new和delete.将std :: deque直接嵌入为成员并避免新建/删除.

如果您需要新/删除:

  1. 尝试使用智能指针
  2. 实现复制构造函数和复制操作符.

如果您决定将其添加为成员,则需要在类中声明它:

class Route ...
{
   ...
   std::deque<Order> orders;
Run Code Online (Sandbox Code Playgroud)

根本不需要新的删除.