Bye All!
#include <stdio.h>
class My
{
public:
char *a;
char *b;
char *c;
My(char*,char *,char*);
void pr();// функция для вывода строки
~My(){};
};
My::My(char * aa,char * bb,char*cc)
{
a=new char[80];b=new char[80];c=new char[80];
strcmp(aa,"")==0?a="constructor a":a=aa;
strcmp(bb,"")==0?b="constructor b":b=bb;
c =cc?cc:"constructor c";
}
My::~My()
{
delete[] a;
delete[] b;delete[] c;
}
void My::pr()
{
char *p=a;
while (p==a)
Console::WriteLine(p++);
p=b;
while (p==b)
Console::WriteLine(p++);
_getch();
}
void f()
{
My b("vvodima","" ,"1c");
b.pr();
_getch();
}
void _tmain()
{
f();
Console::WriteLine(S"Hello World");
_getch();
}
Есть такая прога.Компилирую в MS Visual C++ net 2003.
Цель - она должна выводить строки a,b,c.
Затем "Hello World".
Потом удалить переменые a,b,c.
Сразу предупреждаю, что создал ее чтобы посмотреть на работу конструктора,
потому ничего особенно полезного она не делает.
Как правильно прописать деструктор, удаляющий переменные a,b,c,чтобы при
выполнении (не компиляции) не возникало ошибок?
Bye All!
10 Апр 07 01:48, Вы писали All:
[skipped]
VS> class My
VS> {
VS> public:
VS> char *a;
VS> char *b;
VS> char *c;
VS> My(char*,char *,char*);
VS> void pr();// функция для вывода строки
VS> ~My(){};
^^^^^^^^^
Убери тут фигурные скобки, получается деструктор, который не выполняет никаких
действий.
VS> };
[skipped]
VS> My::~My()
VS> {
VS> delete[] a;
VS> delete[] b;delete[] c;
VS> }
А это так и оставляй. А если скобки не убираешь - у тебя получается 2
определения функции, а такого быть не может.
И вообще, незачем выносить тело такой маленькой функции за пределы класса, там
ее и определи, прям внутри:
class My
{
...
~My ()
{
delete [] a;
delete [] b;
delete [] c;
}
};
Oleg "e1vin" Gromoff,
10 Апр 07 02:50
[ ] my world's in silence...
Tuesday April 10 2007, Vitaliy Sergeev writes to All:
VS> My::My(char * aa,char * bb,char*cc)
VS> {
VS> a=new char[80];b=new char[80];c=new char[80];
VS> strcmp(aa,"")==0?a="constructor a":a=aa;
VS> strcmp(bb,"")==0?b="constructor b":b=bb;
VS> c =cc?cc:"constructor c";
VS> }
Вот здесь ты сначала конструируешь a, b, и c, а затем, не вызывая для них
delete[], оставляешь их болтаться (это три утечки по 80 байт), и присваиваешь
им новые значения -- из аргументов конструктора.
VS> void f()
VS> {
VS> My b("vvodima","" ,"1c");
VS> b.pr();
VS> _getch();
VS> }
А здесь ты в качестве аргументов ставишь литеральные константы. Hо деструктор
(если ты уберешь лишнее {} в декларации) попытается удалить эти константы,
чего, естественно, делать нельзя.
В краткой форме это выглядит так:
char *s=new char[80];
s="blah-blah";
delete[] s;
Или даже так:
int *pi=new int(1);
const int j=2;
pi=&j;
delete pi;
-- во всех трех случаях ошибка, по сути, одна.
Теперь понятно, в чем твоя?
As ever,
Mike Tyukanov
10 апреля 2007 02:50, Oleg Gromoff писал Vitaliy Sergeev:
VS>> class My
VS>> {
VS>> public:
VS>> char *a;
VS>> char *b;
VS>> char *c;
VS>> My(char*,char *,char*);
VS>> void pr();// функция для вывода строки
VS>> ~My(){};
OG> ^^^^^^^^^
OG> Убери тут фигурные скобки, получается деструктор, который не выполняет
OG> никаких действий.
VS>> };
Извини, не заметил, но скобки уже были убраны, иначе бы прога не стала
компилиться.Так что двух определений функции у меня нет.
Именно в варианте без скобок возникает ошибка на этапе исполнения программы.
debug assertion failed
Bye Oleg!
VS> Извини, не заметил, но скобки уже были убраны, иначе бы прога не стала
VS> компилиться.Так что двух определений функции у меня нет.
VS> Именно в варианте без скобок возникает ошибка на этапе исполнения
VS> программы.
VS> debug assertion failed
Тебе уже ответили. Порграмма твоя падает из-за ошибки, которая описана в
каждом FAQ воль и поперек. Еще раз: для того, чтобы скопировать содержимое
одной С-строки в другую необходимо использовать функции копирования
содержимого памяти. В большинстве случаев это банальное 'strcpy':
char* aa = new char[80];
const char* a = "string";
strcpy(aa, a); // <- копирование
Присваивание, которые ты пытаешься использовать,
aa = a;
не выполняет никакого копирования строки, а просто переставляет указатель на
новое место в памяти. Со всем вытекающими.
Best regards, Андрей