Ik ben momenteel een programma aan het schrijven dat bestaat uit verschillende klassen in één broncodebestand. Ik gebruik als compiler & GDE Dev-Cpp onder WinXP. Eén van de klassen geeft een raar probleem. Wanneer ik de klasse alleen gebruik dan werkt hij perfect. Maar doe ik nog iets anders voordat ik die klasse gebruik dan geeft de debugger hij de volgende error:
An acces violation (Segmentation Fault) raised in your program.
Daarbij geeft hij iedere keer dat ik iets willekeurigs heb veranderd een ander regelnummer.
Dit werkt wel:
Dit werkt niet:
Het bestand ziet er zo uit:
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
class fman{}; (bovenstaande)
class config{}; (andere klasse)
int main(){}
Wat doet fman? fman zoekt de gespecificeerde directory af naar bestanden zodra hij aangemaakt wordt. Dan voegt hij aan de filename array een exemplaar toe met het nieuw gevonden bestandsnaam. In de functie add werk ik met de heap. Dus daar zit waarschijnlijk de fout.
Wanneer ik de regel:
delete []filename;
weghaal, dan werkt de code wel goed, maar hij zou toch ook moeten werken met die regel er in? Waarom werkt het de ene keer wel en de andere keer niet met die regel ertussen?
Wat is er fout? Of waar moet ik naar zoeken?
An acces violation (Segmentation Fault) raised in your program.
Daarbij geeft hij iedere keer dat ik iets willekeurigs heb veranderd een ander regelnummer.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| class fman{ public: string* filename; private: int size; void add(string r){ size++; string* b = new string[size]; for(int i = 0; i < size-1; i++) b[i] = filename[i]; delete []filename;// <-- filename = b; if(r != "") filename[size-1] = r; } public: fman(string DirSpec){ size = 0; WIN32_FIND_DATA FindFileData; HANDLE hFind = INVALID_HANDLE_VALUE; if(DirSpec.size() < MAX_PATH){ hFind = FindFirstFile(DirSpec.c_str(), &FindFileData); if(hFind == INVALID_HANDLE_VALUE){ add("FILE_ERROR"); } else{ add(FindFileData.cFileName); while(FindNextFile(hFind,&FindFileData) != 0){ add(FindFileData.cFileName); } } } } ~fman(){ delete []filename; } int NumberOfFiles(){ return size; } }; |
Dit werkt wel:
C++:
1
2
3
4
5
6
7
| int main(){ fman b("C:\\WINDOWS\\*"); cout << b.filename[0] << endl; string q; cin >> q; return 0; } |
Dit werkt niet:
C++:
1
2
3
4
5
6
7
| int main(){ string q; cin >> q; fman b("C:\\WINDOWS\\*"); cout << b.filename[0] << endl; return 0; } |
Het bestand ziet er zo uit:
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
class fman{}; (bovenstaande)
class config{}; (andere klasse)
int main(){}
Wat doet fman? fman zoekt de gespecificeerde directory af naar bestanden zodra hij aangemaakt wordt. Dan voegt hij aan de filename array een exemplaar toe met het nieuw gevonden bestandsnaam. In de functie add werk ik met de heap. Dus daar zit waarschijnlijk de fout.
Wanneer ik de regel:
delete []filename;
weghaal, dan werkt de code wel goed, maar hij zou toch ook moeten werken met die regel er in? Waarom werkt het de ene keer wel en de andere keer niet met die regel ertussen?
Wat is er fout? Of waar moet ik naar zoeken?
[ Voor 10% gewijzigd door -DarkShadow- op 11-08-2004 21:03 ]
Specialist in:
Soldeerstations
Oscilloscoop