Я хочу инициализировать строку char * внутри структуры.
это структура:
typedef struct __String {
char* data; // C-string data,
unsigned* copyRef; // number of copy reference, delete only when the copyRef is 0
bool isACopy; // this boolean is true when *data is a ref to an other MyString
__String () {
data = 0;
isACopy = false;
copyRef = new unsigned();
*copyRef = 0;
return;
}
void addCopyRef() {
*copyRef++;
}
void removeCopyRef() {
*copyRef--;
}
} *MyString;
и это тот момент, когда это сбой ..
void Initialize(MyString& string){
string->data = new char[LENGHT];
string->data[0] ='\0'; // this generate an error!
string->addCopyRef();
}
это главное:
MyString left_string, right_string, both_string;
Initialize(left_string);
Initialize(right_string);
Initialize(both_string);
первый идет хорошо, второй нет ..
Не могли бы вы помочь мне понять, в чем проблема? Спасибо!
Вы должны выделить память для объектов, прежде чем передавать их следующим образом:
MyString left_string = new __String();
Initialize(left_string);
Как правило, такие typedefs не выполняются, они очень запутанные и подвержены ошибкам. Если вы решили напечатать указатель, по крайней мере, укажите, что это указатель в типе, т.е. typedef struct __String* MyStringPtr
,
typedef struct __String {
char* data; // C-string data,
unsigned* copyRef; // number of copy reference,
// delete only when the copyRef is 0
bool isACopy; // this boolean is true when *data
// is a ref to an other MyString
__String () {
data = 0;
isACopy = false;
copyRef = new unsigned;
*copyRef = 0;
return;
}
void addCopyRef() {
*copyRef++;
}
void removeCopyRef() {
*copyRef--;
}
} *MyString;void Initialize(MyString& string){
string->data = new char[100];
string->data[0] ='\0'; // this generate an error!
string->copyRef = new unsigned();
string->addCopyRef();
}
int main()
{
MyString mystring = new struct __String;
Initialize(mystring);
}
Я тестировал, как это без каких-либо ошибок. с g ++ на Linux.
Я думаю тебе лучше
Я проверил снова с другим main () ниже.
int main()
{
MyString mystring = new struct __String;
MyString mystring1 = new struct __String;
MyString mystring2 = new struct __String;
Initialize(mystring);
Initialize(mystring1);
Initialize(mystring2);
}
С этим тестовым кодом ошибки нет.
Я думаю, что вы пропустили создание объекта, на который указывает mystring
(В вашем коде left_string
, right_string
, both_string
).
Наверное, причина была бы в этом.
И этот код вызывает утечку памяти из конструктора. В этом состоянии кода конструктор не нужен.