#1 Le 05/06/2016, à 13: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
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, à 14:03)
Hors ligne
#2 Le 05/06/2016, à 14: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, à 14:39
- Destroyers
Re : [C++] invalid use of incomplete type ‘struct __dirstream’
Ah en effet merci beaucoup du coup ça compile
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, à 14: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, à 14:47)
Hors ligne
#5 Le 05/06/2016, à 15: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
Hors ligne