+2017-10-14  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       * memrange.h (struct mem_range): Add constructors.
+       * tracepoint.h (struct traceframe_info) <memory>: Change type to
+       std::vector<mem_range>.
+       * tracepoint.c (free_traceframe_info): Don't manually free
+       vector.
+       (traceframe_info_start_memory): Adjust to vector change.
+       (traceframe_available_memory): Likewise.
+       * tracefile-tfile.c (build_traceframe_info): Likewise.
+       * ctf.c (ctf_traceframe_info): Likewise.
+
 2017-10-14  Simon Marchi  <simon.marchi@polymtl.ca>
 
        * tracepoint.h (struct traceframe_info) <tvars>: Change type to
 
            = bt_ctf_get_top_level_scope (event,
                                          BT_EVENT_FIELDS);
          const struct bt_definition *def;
-         struct mem_range *r;
 
-         r = VEC_safe_push (mem_range_s, info->memory, NULL);
          def = bt_ctf_get_field (event, scope, "address");
-         r->start = bt_ctf_get_uint64 (def);
+         CORE_ADDR start = bt_ctf_get_uint64 (def);
 
          def = bt_ctf_get_field (event, scope, "length");
-         r->length = (uint16_t) bt_ctf_get_uint64 (def);
+         int length = (uint16_t) bt_ctf_get_uint64 (def);
+
+         info->memory.emplace_back (start, length);
        }
       else if (strcmp (name, "tsv") == 0)
        {
 
 
 struct mem_range
 {
+  mem_range () = default;
+
+  mem_range (CORE_ADDR start_, int length_)
+  : start (start_), length (length_)
+  {}
+
   /* Lowest address in the range.  */
   CORE_ADDR start;
 
 
     {
     case 'M':
       {
-       struct mem_range *r;
        ULONGEST maddr;
        unsigned short mlen;
 
                                          2, gdbarch_byte_order
                                          (target_gdbarch ()));
 
-       r = VEC_safe_push (mem_range_s, info->memory, NULL);
-
-       r->start = maddr;
-       r->length = mlen;
+       info->memory.emplace_back (maddr, mlen);
        break;
       }
     case 'V':
 
 static void
 free_traceframe_info (struct traceframe_info *info)
 {
-  if (info != NULL)
-    {
-      VEC_free (mem_range_s, info->memory);
-
-      delete info;
-    }
+  delete info;
 }
 
 /* Free and clear the traceframe info cache of the current
                              void *user_data, VEC(gdb_xml_value_s) *attributes)
 {
   struct traceframe_info *info = (struct traceframe_info *) user_data;
-  struct mem_range *r = VEC_safe_push (mem_range_s, info->memory, NULL);
   ULONGEST *start_p, *length_p;
 
   start_p
   length_p
     = (ULONGEST *) xml_find_attribute (attributes, "length")->value;
 
-  r->start = *start_p;
-  r->length = *length_p;
+  info->memory.emplace_back (*start_p, *length_p);
 }
 
 /* Handle the start of a <tvar> element.  */
 
   if (info != NULL)
     {
-      struct mem_range *r;
-      int i;
-
       *result = NULL;
 
-      for (i = 0; VEC_iterate (mem_range_s, info->memory, i, r); i++)
-       if (mem_ranges_overlap (r->start, r->length, memaddr, len))
+      for (mem_range &r : info->memory)
+       if (mem_ranges_overlap (r.start, r.length, memaddr, len))
          {
            ULONGEST lo1, hi1, lo2, hi2;
            struct mem_range *nr;
            lo1 = memaddr;
            hi1 = memaddr + len;
 
-           lo2 = r->start;
-           hi2 = r->start + r->length;
+           lo2 = r.start;
+           hi2 = r.start + r.length;
 
            nr = VEC_safe_push (mem_range_s, *result, NULL);
 
 
 struct traceframe_info
 {
   /* Collected memory.  */
-  VEC(mem_range_s) *memory = NULL;
+  std::vector<mem_range> memory;
 
   /* Collected trace state variables.  */
   std::vector<int> tvars;