Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/06/2016, à 14:51

Destroyers

[C++] invalid use of incomplete type ‘struct __dirstream’

Salut à tous.
J'essaie de créer une classe permettant de manipuler des répertoires.
Malheureusement une erreur de compilation survient et je ne sais pas trop quoi y faire hmm
je requière votre aide ^^
d'avance, merci

#ifndef DIRECTORY_H_
#define DIRECTORY_H_

#include <string>
#include <dirent.h>
#include <unistd.h>
#include <vector>
#include <sys/stat.h>

class Directory
{
public:
  Directory(std::string const& path = "");
  Directory(Directory const &Other) = delete;

  ~Directory();

  void open();
  void close();
 
  std::vector<std::string> getContent();
  std::vector<long> getId();

  Directory& operator=(Directory const &Other) = delete; 
  
protected:
  std::string _path;
  DIR *_dir;

};

#endif //DIRECTORY_H_
#include "dir.hpp"

int main()
{
  return 0;
}


Directory::Directory(std::string const& path) : _path(path), _dir(nullptr)
{
}

Directory::~Directory()
{
  closedir(_dir);
  delete _dir;
  _dir = nullptr;
}

void Directory::open()
{
    _dir = opendir(_path.c_str());
}

void Directory::close()
{
  closedir(_dir);
}

std::vector<std::string> Directory::getContent()
{
  std::vector<std::string> content;
  struct dirent *fileInfo;
  
  while((fileInfo = readdir(_dir)) != nullptr)
    content.push_back(fileInfo -> d_name);

  return content;
}

std::vector<long> Directory::getId()
{
  std::vector<long> id;
  
  while(readdir(_dir) != nullptr)
  {
    id.push_back(telldir(_dir));   
  }
  
  return id;
}
dir.cpp: In destructor ‘Directory::~Directory()’:
dir.cpp:16:10: error: possible problem detected in invocation of delete operator: [-Werror]
   delete _dir;
          ^
dir.cpp:16:10: error: invalid use of incomplete type ‘struct __dirstream’ [-Werror]
In file included from dir.hpp:5:0,
                 from dir.cpp:1:
/usr/include/dirent.h:127:16: error: forward declaration of ‘struct __dirstream’ [-Werror]
 typedef struct __dirstream DIR;
                ^
dir.cpp:16:10: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined
   delete _dir;
          ^
cc1plus: all warnings being treated as errors
make: *** [dir] Erreur 1

Notez que j'ai bien compris qu'il me dis de modifier mon destructeur en enlevant "delete, mais n'aurai-je pas une fuite de mémoire ?

Dernière modification par Destroyers (Le 05/06/2016, à 15:03)

Hors ligne

#2 Le 05/06/2016, à 15:18

louis94

Re : [C++] invalid use of incomplete type ‘struct __dirstream’

Bonjour,

Tu utiliser une API faite pour C depuis C++. C'est tout à fait possible, mais il faut s'attendre à ce que certaines choses soient différentes. Ici,  closedir() se charge de libérer la mémoire comme un grand (source). Tu ne dois donc plus faire delete après.

Louis

NB:
Est-ce que tu as regardé du côté de boost::filesystem ou même de std::filesystem (C++17) ?

Hors ligne

#3 Le 05/06/2016, à 15:39

Destroyers

Re : [C++] invalid use of incomplete type ‘struct __dirstream’

Ah en effet merci beaucoup du coup ça compile big_smile
en revanche, pourquoi il n'y a pas d'erreur pour la fonction Directory::close() alors que je fais un delete moi même en plus de closedir() ?

Hors ligne

#4 Le 05/06/2016, à 15:45

louis94

Re : [C++] invalid use of incomplete type ‘struct __dirstream’

[edit] Pas de delete ici:[/edit]

void Directory::close()
{
  closedir(_dir);
}

Tu devrais aussi faire _dir = nullptr.

Si tu veux éviter des erreurs de segmentation, tu dois vérifier dans toutes les méthodes que _dir != nullptr. Tu as aussi une fuite mémoire si tu considères le code suivant:

Directory home("/home");
home.open();
home.open();

Louis

Dernière modification par louis94 (Le 05/06/2016, à 15:47)

Hors ligne

#5 Le 05/06/2016, à 16:18

Destroyers

Re : [C++] invalid use of incomplete type ‘struct __dirstream’

Ah oui en effet j'avais pas de delete x)
les vérifications sont prévues, je faisais juste des tests dans un premier temps

louis94 oui je connais ces libs, mais j'aime coder mes ptit trucs. Même si je sais que les libs sont forcement mieux que mes trucs, je sais ce que j'ai écrit et ça m'oblige a réfléchir pour coder tout ça smile

Hors ligne