diff --git a/include/adc_circuit.h b/include/adc_circuit.h
index 2ee5c3df326f83a43a746355c03f09dbcedc6ca5..d343e5db0c72345ba41ed3172cd8546da6bd251b 100644
--- a/include/adc_circuit.h
+++ b/include/adc_circuit.h
@@ -18,7 +18,7 @@
 class CAdcCircuit
 {
   private:
-    std::vector<CAdcRoad> roads;///< Variable to store an access each road data.
+    std::vector<CAdcRoad*> roads;///< Variable to store an access each road data.
 
   public:
     /**
@@ -47,7 +47,7 @@ class CAdcCircuit
      * \param road The road to add.
      *
      */
-    void add_road(CAdcRoad &road);
+    void add_road(CAdcRoad* &road);
 
     /**
      * \brief Function to print each road info.
diff --git a/src/adc_circuit.cpp b/src/adc_circuit.cpp
index 21efc1a23d93afab634f099a76be9127b042314f..d2466e00b383b3371aa53cd562254752d5ca9f7e 100644
--- a/src/adc_circuit.cpp
+++ b/src/adc_circuit.cpp
@@ -16,10 +16,12 @@ CAdcCircuit::~CAdcCircuit()
 
 void CAdcCircuit::clear_roads(void)
 {
-  std::vector<CAdcRoad>().swap(this->roads);
+  for (unsigned int i = 0; i < this->roads.size(); i++)
+    delete this->roads[i];
+  std::vector<CAdcRoad*>().swap(this->roads);
 }
 
-void CAdcCircuit::add_road(CAdcRoad &road)
+void CAdcCircuit::add_road(CAdcRoad* &road)
 {
   this->roads.push_back(road);
 }
@@ -27,20 +29,20 @@ void CAdcCircuit::add_road(CAdcRoad &road)
 void CAdcCircuit::debug(void)
 {
   for (unsigned int i = 0; i < this->roads.size(); i++)
-    this->roads[i].debug();
+    this->roads[i]->debug();
 }
 
 void CAdcCircuit::calculate_signals_pose(bool debug)
 {
   for (unsigned int i = 0; i < this->roads.size(); i++)
-    this->roads[i].calculate_signals_pose(debug);
+    this->roads[i]->calculate_signals_pose(debug);
 }
 
 void CAdcCircuit::get_signals(std::vector<CAdcSignals*> &signals)
 {
   std::vector<CAdcSignals*>().swap(signals);
   for (unsigned int i = 0; i < this->roads.size(); i++)
-    this->roads[i].get_signals(signals);
+    this->roads[i]->get_signals(signals);
 }
 
 void CAdcCircuit::generate_spwan_launch_file(std::string &filename)
@@ -62,7 +64,7 @@ void CAdcCircuit::generate_spwan_launch_file(std::string &filename)
 
   //sign info
   for (unsigned int i = 0; i < this->roads.size(); i++)
-    this->roads[i].append_signs_spawn(filename);
+    this->roads[i]->append_signs_spawn(filename);
 
   //End
   oss.str("");
diff --git a/src/open_drive_format.cpp b/src/open_drive_format.cpp
index 4664f5ec3807afff078f61b67f38d6ddf8e4acbe..5d37629ce91ee3e62dabef4397639d35726bfc00 100644
--- a/src/open_drive_format.cpp
+++ b/src/open_drive_format.cpp
@@ -39,7 +39,7 @@ void COpenDriveFormat::load(std::string &filename, bool debug)
         ss >> road_id;
         double road_length = road_it->length().get();
         std::string name = road_it->name().get();
-        CAdcRoad road(road_id, road_length, name);
+        CAdcRoad *road = new CAdcRoad(road_id, road_length, name);
 
         ///////////////////// link atributes
 
@@ -54,20 +54,20 @@ void COpenDriveFormat::load(std::string &filename, bool debug)
           if (geo_it->line().present())
           {
             CAdcGeoLine *line = new CAdcGeoLine(min_s, max_s, x, y, heading);
-            road.add_geometry(line);
+            road->add_geometry(line);
           }
           else if (geo_it->spiral().present())
           {
             double curv_start = (geo_it->spiral().get().curvStart().present() ? geo_it->spiral().get().curvStart().get() : 0.0);
             double curv_end = (geo_it->spiral().get().curvEnd().present() ? geo_it->spiral().get().curvEnd().get() : 0.0);
             CAdcGeoSpiral *spi = new CAdcGeoSpiral(min_s, max_s, x, y, heading, curv_start, curv_end);
-            road.add_geometry(spi);
+            road->add_geometry(spi);
           }
           else if (geo_it->arc().present())
           {
             double curvature = (geo_it->arc().get().curvature().present() ? geo_it->arc().get().curvature().get() : 0.0);
             CAdcGeoArc *arc = new CAdcGeoArc(min_s, max_s, x, y, heading, curvature);
-            road.add_geometry(arc);
+            road->add_geometry(arc);
           }
           else if (geo_it->poly3().present())
           {
@@ -77,7 +77,7 @@ void COpenDriveFormat::load(std::string &filename, bool debug)
             param.c = (geo_it->poly3().get().c().present() ? geo_it->poly3().get().c().get() : 0.0);
             param.d = (geo_it->poly3().get().d().present() ? geo_it->poly3().get().d().get() : 0.0);
             CAdcGeoPoly3 *poly3 = new CAdcGeoPoly3(min_s, max_s, x, y, heading, param);
-            road.add_geometry(poly3);
+            road->add_geometry(poly3);
           }
           else if (geo_it->paramPoly3().present())
           {
@@ -95,7 +95,7 @@ void COpenDriveFormat::load(std::string &filename, bool debug)
             if (geo_it->paramPoly3().get().pRange().present() && geo_it->paramPoly3().get().pRange().get() == pRange::arcLength)
               normalized = false;
             CAdcGeoParamPoly3 *parampoly3 = new CAdcGeoParamPoly3(min_s, max_s, x, y, heading, u_param, v_param, normalized);
-            road.add_geometry(parampoly3);
+            road->add_geometry(parampoly3);
           }
         }
 
@@ -118,7 +118,7 @@ void COpenDriveFormat::load(std::string &filename, bool debug)
             if (signal_it->orientation().present() && signal_it->orientation().get() == orientation::cxx_1)
               reverse = true;
             CAdcSignals *sign = new CAdcSignals(id, s, t, heading, type, sub_type, value, text, reverse);
-            road.add_signal(sign);
+            road->add_signal(sign);
           }
         }
         this->adc_circuit.add_road(road);