У меня в программе, которую я пишу, есть три пользовательских класса: ConceptClass, GraphRep и Hamming. Я пытаюсь построить объект Хемминга, используя конструктор с одним параметром типа «ConceptClass». Внутри этого конкретного конструктора для объекта Хемминга объект GraphRep должен быть создан с использованием конструктора с единственным параметром типа ‘int’.
Вот код:
GraphRep.H:
#include <iostream>
#include <math.h>
#include "ConceptClass.h"#include "ConceptClassWriter.h"
#ifndef __GRAPHREP_H
#define __GRAPHREP_H
using namespace std;
class GraphRep
{
private:
//Size of matrix
int n;
//Number of Instances
int m;
//Boolean adjacency matrix
int* boolMat;
//Weighted adjacency matrix
int* weightMat;
//numer of vertices
int verts;
//number of edges
int edges;
//Degree Sequence
int* degSeq;
//Associated Concept Class
ConceptClass conc;public:
//Default constructor
GraphRep();
//Constructor for empty graph with n vertices
GraphRep(int nn);
//Copy constructor
GraphRep(const GraphRep& original);
//Destructor
~GraphRep();
};
#endif
GraphRep.cpp:
#include "GraphRep.h"
GraphRep::GraphRep()
{
n = 0;
m = 0;
boolMat = new int[n*n];
weightMat = new int[n*n];
verts = 0;
edges = 0;
degSeq = new int[n];
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
boolMat[i*n+j] = 0;
weightMat[i*n+j] = 0;
}
degSeq[i] = 0;
}
}
GraphRep::GraphRep(int nn)
{
n = nn;
m = 0;
boolMat = new int[n*n];
weightMat = new int[n*n];
verts = n;
edges = 0;
degSeq = new int[n];
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
boolMat[i*n+j] = 0;
weightMat[i*n+j] = 0;
}
degSeq[i] = 0;
}
}
GraphRep::GraphRep(const GraphRep& original)
{
n = original.n;
m = original.m;
boolMat = new int[n*n];
weightMat = new int[n*n];
verts = original.verts;
edges = original.edges;
degSeq = new int[n];
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
boolMat[i*n+j] = original.boolMat[i*n+j];
weightMat[i*n+j] = original.boolMat[i*n+j];
}
degSeq[i] = original.degSeq[i];
}}
GraphRep::~GraphRep()
{
//delete[] boolMat;
//delete[] weightMat;
//delete[] degSeq;
}
Hamming.h:
#ifndef HAMMING_H
#define HAMMING_H
#include <iostream>
#include <math.h>
#include "ConceptClass.h"#include "GraphRep.h"
using namespace std;
class Hamming
{
private:
ConceptClass conc;
int n;
public:
Hamming();
Hamming(ConceptClass C);
~Hamming();
};#endif
Hamming.cpp:
#include "Hamming.h"
Hamming::Hamming()
{
n = 0;
}
Hamming::Hamming(ConceptClass C)
{
conc = C;
n = C.getN();
GraphRep g1(n);
}
Hamming::~Hamming()
{
}
раздел main.cpp:
#include<iostream>
#include<list>
#include "ConceptClass.h"#include "GraphRep.h"#include "Hamming.h"
using namespace std;
...
//Load the concept classes from a file
list<ConceptClass> classes = load.loadConceptClasses(argv[2]);
for ( it=classes.begin(); it != classes.end(); it++ )
{
Hamming H(*it);
}
Когда я пытаюсь запустить код, я получаю следующую ошибку:
* glibc обнаружен vcdrtd: free (): неверный указатель: 0x0000000000402390 **
======= Backtrace: ========= /lib64/libc.so.6[0x3e0ee76166] vcdrtd [0x40bff0] vcdrtd [0x41b7d2] vcdrtd [0x41f6b3] vcdrtd [0x4031f1] /lib64/libc.so.6(__libc_start_main+0xfd)[0x3e0ee1ed1d] vcdrtd [0x4023b9] ======= Карта памяти: ======== 00400000-0042d000 r-xp 00000000 00:18 194332023 / home / zermelo / melocher / temp2 / vcdrtd
0062c000-0062e000 rw-p 0002c000 00:18 194332023
/ home / zermelo / melocher / temp2 / vcdrtd 01bfb000-01c1c000 rw-p 00000000
00:00 0 [куча] 3e0ea00000-3e0ea20000
r-xp 00000000 08:01 554121 /lib64/ld-2.12.so
3e0ec1f000-3e0ec20000 r — p 0001f000 08:01 554121
/lib64/ld-2.12.so 3e0ec20000-3e0ec21000 rw-p 00020000 08:01 554121
/lib64/ld-2.12.so 3e0ec21000-3e0ec22000 rw-p 00000000 00:00 0
3e0ee00000-3e0ef8b000 r-xp 00000000 08:01 554124
/lib64/libc-2.12.so 3e0ef8b000-3e0f18a000 — p 0018b000 08:01 554124
/lib64/libc-2.12.so 3e0f18a000-3e0f18e000 r — p 0018a000 08:01 554124
/lib64/libc-2.12.so 3e0f18e000-3e0f18f000 rw-p 0018e000 08:01 554124
/lib64/libc-2.12.so 3e0f18f000-3e0f194000 rw-p 00000000 00:00 0
3e0f200000-3e0f283000 r-xp 00000000 08:01 554128
/lib64/libm-2.12.so 3e0f283000-3e0f482000 — p 00083000 08:01 554128
/lib64/libm-2.12.so 3e0f482000-3e0f483000 r — p 00082000 08:01 554128
/lib64/libm-2.12.so 3e0f483000-3e0f484000 rw-p 00083000 08:01 554128
/lib64/libm-2.12.so 3e14600000-3e14616000 r-xp 00000000 08:01 554155
/lib64/libgcc_s-4.4.7-20120601.so.1 3e14616000-3e14815000 — p
00016000 08:01 554155
/lib64/libgcc_s-4.4.7-20120601.so.1 3e14815000-3e14816000 rw-p
00015000 08:01 554155
/lib64/libgcc_s-4.4.7-20120601.so.1 3e15a00000-3e15ae8000 r-xp
00000000 08:01 1373404
/usr/lib64/libstdc++.so.6.0.13 3e15ae8000-3e15ce8000 — p 000e8000
08:01 1373404 /usr/lib64/libstdc++.so.6.0.13
3e15ce8000-3e15cef000 r — p 000e8000 08:01 1373404
/usr/lib64/libstdc++.so.6.0.13 3e15cef000-3e15cf1000 rw-p 000ef000
08:01 1373404 /usr/lib64/libstdc++.so.6.0.13
3e15cf1000-3e15d06000 rw-p 00000000 00:00 0 7f564db0a000-7f564db0f000
rw-p 00000000 00:00 0 7f564db39000-7f564db3c000 rw-p 00000000 00:00 0
7fff92840000-7fff92855000 rw-p 00000000 00:00 0
[стек] 7fff92896000-7fff92897000 r-xp 00000000 00:00 0
[vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0
[vsyscall] Прервать (ядро сброшено)
Кажется, что конструктор Хемминга с типом концептуального класса работает нормально, но проблема возникает с GraphRep g1 (n); вызов изнутри этого конструктора Хемминга. Если я изменю его на GraphRep g1 (); он будет работать нормально, и если я поменяю его на GraphRep g1; это также вызывает дамп ядра.
У меня нет большого опыта с динамическим управлением памятью, поэтому я предполагаю, что проблема связана с деструкторами. Вы заметите, что удаления в деструкторе GraphRep закомментированы. Я пытался запустить его с этими удаляет, но получил ту же проблему.
Также кажется, что проблема вызвана тем фактом, что у меня есть цикл в моей основной функции. Обычно все в порядке с созданием одного объекта Хемминга, но затем в конце этой первой итерации возникает проблема.
Пожалуйста, дайте мне знать, если у вас есть какие-либо советы для меня, или если нужна дополнительная информация.
Спасибо!
РЕДАКТИРОВАТЬ: Извините, это должен был быть GraphRep g1 (n); Та же проблема, я просто экспериментировал с разными вещами и забыл поменять его на пост. GraphRep g1 (n); должен создать объект типа GraphRep, вызвав конструктор GraphRep (int nn).
РЕДАКТИРОВАТЬ: Я также попытался полностью закомментировать содержимое конструктора GraphRep (int nn), так что он становится следующим:
GraphRep::GraphRep(int nn)
{
}
Это все еще дает ошибку. Не уверен, что я делаю не так с этим перегруженным конструктором.
Задача ещё не решена.
Других решений пока нет …