Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ delete[]不会根据Valgrind释放内存_C++_Class_Memory Management_Valgrind_Destructor - Fatal编程技术网

C++ delete[]不会根据Valgrind释放内存

C++ delete[]不会根据Valgrind释放内存,c++,class,memory-management,valgrind,destructor,C++,Class,Memory Management,Valgrind,Destructor,我有一个类unix_socket,它的属性是double*,并在其构造函数中使用new分配内存: class unix_socket::unix_socket(){ //... array_recvd=new double[10]; //... } 因此,我在其析构函数中使用delete[]来释放内存: unix_socket::~unix_socket(){ //.. delete[] array_recvd; //... } 但是,当使用V

我有一个类unix_socket,它的属性是double*,并在其构造函数中使用new分配内存:

class unix_socket::unix_socket(){
    //...
    array_recvd=new double[10];
    //...
}
因此,我在其析构函数中使用delete[]来释放内存:

unix_socket::~unix_socket(){
    //..
    delete[] array_recvd;
    //...
}
但是,当使用Valgrind检查程序中的内存泄漏时,阵列使用的内存不会被释放:

==4683== HEAP SUMMARY:
==4683==     in use at exit: 80 bytes in 1 blocks
==4683==   total heap usage: 2 allocs, 1 frees, 648 bytes allocated
==4683== 
==4683== Searching for pointers to 1 not-freed blocks
==4683== Checked 188,184 bytes
==4683== 
==4683== 80 bytes in 1 blocks are still reachable in loss record 1 of 1
==4683==    at 0x4C2BBA4: operator new[](unsigned long) (vg_replace_malloc.c:363)
==4683==    by 0x406503: unix_socket::unix_socket() (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/client)
==4683==    by 0x402355: main (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/client)
==4683== 
==4683== LEAK SUMMARY:
==4683==    definitely lost: 0 bytes in 0 blocks
==4683==    indirectly lost: 0 bytes in 0 blocks
==4683==      possibly lost: 0 bytes in 0 blocks
==4683==    still reachable: 80 bytes in 1 blocks
==4683==         suppressed: 0 bytes in 0 blocks
我确信这次泄漏是由于vector_recvd array_recvd造成的,因为只有当我将它作为属性时,它才会出现。我到底做错了什么?如何释放double数组分配的内存

编辑:这就是我用来复制这个问题的main.cpp:

int main () {

  unix_socket client;    
  client.initSocket(DEFAULT_SOCKET_PATH,CLIENT_MODE);

  for (int i = 0; i < 100; ++i){
    client.sendVectorXd(VectorXd::Ones(30));
  }

  client.closeSocket();    
  return 0;
}

我假设调用exit将调用析构函数,现在我明白了,情况并非如此。

您确定已销毁所有unix\u socket实例吗?另外,如果array\u recvd始终是10个double的数组,然后,您可以直接将该数据成员声明为数组,并消除删除它的负担。通过查看不匹配的新[]:vg_replace_malloc.c:363的文件和行号,您可以更清楚地了解泄漏的内容。你的代码片段说的是array\u recvd,但是你的评论说的是vector\u recvd。这个unix\u套接字是如何构造的,在哪里构造的?valgrind认为该对象仍然可以访问,这表明该对象根本没有被销毁。您确定存在内存泄漏,因为绝对丢失为0吗?
if (connect(client_sock, (struct sockaddr *)&remote, len) == -1) {
    perror("connect");
    exit(1);
}