简体   繁体   English

带有向量的分配结构的内存泄漏

[英]memory leak with allocated struct containing a vector

I'm running into an issue where, when I have a std::vector in a struct, and I heap allocate that struct, when the struct gets free'd, the vector leaks. 我遇到一个问题,当我在一个结构中有一个std :: vector时,我堆分配了该结构,当该结构被释放时,矢量泄漏了。 Any ideas on how to prevent this? 关于如何防止这种情况的任何想法?

Here's the code: 这是代码:

#include <cstdlib>
#include <string>
#include <vector>

struct foo {
  std::vector<std::string> bar;
};

const std::vector<std::string> kSample = {"test", "1", "2", "3", "4", "5"};

int main(int argc, char *argv[]) {
  struct foo *allocated = new foo;
  for (const auto& i : kSample) {
    allocated->bar.push_back(i);
  }
  free(allocated);
  return 0;
}

Here's the valgrind results from running this code: 这是运行此代码的valgrind结果:

==18131== 192 bytes in 1 blocks are definitely lost in loss record 51 of 76
==18131==    at 0x6DFB: malloc (in /usr/local/Cellar/valgrind/3.9.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==18131==    by 0x4728D: operator new(unsigned long) (in /usr/lib/libc++.1.dylib)
==18131==    by 0x10000283D: std::__1::__split_buffer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >&>::__split_buffer(unsigned long, unsigned long, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >&) (in ./build/tools/test)
==18131==    by 0x100001EEC: std::__1::__split_buffer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >&>::__split_buffer(unsigned long, unsigned long, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >&) (in ./build/tools/test)
==18131==    by 0x100001D9B: void std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::__push_back_slow_path<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) (in ./build/tools/test)
==18131==    by 0x100001278: main (in ./build/tools/test)
==18131==
==18131== LEAK SUMMARY:
==18131==    definitely lost: 192 bytes in 1 blocks
==18131==    indirectly lost: 0 bytes in 0 blocks
==18131==      possibly lost: 0 bytes in 0 blocks
==18131==    still reachable: 0 bytes in 0 blocks
==18131==         suppressed: 25,768 bytes in 377 blocks

You should call delete allocated; 您应该调用delete allocated; . new and delete should be used in pair. newdelete应该成对使用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM