Страница 1 из 7
Что тут неправильного?
Добавлено: 25 окт 2006, 12:52
tiasur
struct MStruct
{
int *ptr;
MStruct(int n) { ptr = new int; *ptr = n; }
~MStruct() { delete ptr; }
};
Re: Что тут неправильного?
Добавлено: 25 окт 2006, 13:25
dima
tiasur писал(а):struct MStruct
{
int *ptr;
MStruct(int n) { ptr = new int; *ptr = n; }
~MStruct() { delete ptr; }
};
1. default constructor не определен, поэтому destructor упадет с сигналом
2. copy constructor не определен - скопируется мусор, destructor упадет
Добавлено: 25 окт 2006, 13:30
aissp
Краткий ответ, если память не выделилась то присваивание *ptr = n ведет к краху.
О прокоментирую предыдущего оратора.
1. не согласный я
Myclass qq(5); ....
попытки сделать что-либо другое вызовут ошиППку компиляции что есть карошо
2. Тут да проблема
{
Myclass qq(5);
{
Myclass qq1(qq); //or qq1=qq; почленное копирование тут
}
//here we have got a some trouble s=)
}
Добавлено: 25 окт 2006, 13:38
tiasur
Ничего не падает:
Код: Выделить всё
struct MStruct
{
int *ptr;
MStruct(int n) { ptr= new int; *ptr = n; }
} strMe(10);
void main()
{
printf( "%d\n", *strMe.ptr);
while(1);
}
Добавлено: 25 окт 2006, 13:41
sobomax
tiasur писал(а):Ничего не падает:
А чего тогда спрашиваеш?
-Maxim
Добавлено: 25 окт 2006, 13:44
aissp
Ну как же
ptr = nrew int; //we havent resources so right now new return 0 (or some garbage and bad_alloc)
//if we got bad_alloc we get cored dump immediately in opposite case the next string is
*(0) = n; //with the same result
Добавлено: 25 окт 2006, 13:53
tiasur
А чего тогда спрашиваеш?
Выдает ошибку когда в конце освобождаю память:
we havent resources so right now new return 0 (or some garbage and bad_alloc)
Мне кажется не в этом дело. Памяти в данном случае запрашивается не много и что-то подобное часто встречается.
Добавлено: 25 окт 2006, 13:57
aissp
А так ето практический вопрос? Ну конструктор я бы все равно переписал енсли уж есть явная необходимость хрнить так=)
Скорее всего связано с отсуствием конструктора копирования - где то ты передаешь структуру в функцию по значению, и соотвественно вызываешь два деструктора для одного и того же указателя
О майн гот, тока ща заметил. Ты вызывваешь деструктор в майне а структуру объявляешь глобально? После выхода из майна деструктор будет вызван опять. Ой, блин и еще добавлю, если определил ету фигню не в теле майна никто не гарантирует что в то время когда ты опрашиваешь указатель в майне он будет определен.
Добавлено: 25 окт 2006, 14:14
tiasur
aissp
А так ето практический вопрос?
Да нет это задачки от Майкрософта. Наверно все-таки ты прав. Вот еще задачка:
Код: Выделить всё
class A { public: int a, b; };
class B
{
public:
const A a;
B() :a() { }
};
int main()
{
B b;
printf( "%d %d\n", b.a.a, b.a.b );
return 0;
}
Что не так? Я вижу только бессмысленность, так как в int a, b; будут случайные значения изменить которые нельзя.
Добавлено: 25 окт 2006, 14:39
aissp
Вообще то 0 там будут, благо инт (вот могу соврать но вроде еще помнб стандарт) обязан проинициализироваться нулем. В остальноя я проблем тут честно гря не вижу. Константа инициализируется в списке инициализации, в противном случае была бы ощибка компиляции, данный в функцию передаются по значению (опять же ошибка компиляции в противном случае). Сдаюсь я тут. Данный код в том виде в котором представлен обязан работать:)
Где ж тыт таких задач то набрал? =)
Добавлено: 25 окт 2006, 14:48
tiasur
aissp писал(а):Вообще то 0 там будут
У меня получается многозначное число, причем b.a.a = b.a.b
Где ж тыт таких задач то набрал? =)
Работодатели и их соратники присылают, хотя я почти и не программист.
Добавлено: 25 окт 2006, 14:51
aissp
Ну значит стандарт не гарантирует или компилятор не удовлетворяет стандарту. Ну либо я дятел, что тоже вполне возможно.+)
Ну ты присылай если чего, хоть освежу в памяти то чем практически никогда не пользуюсь=)
О да я дятель, локальные объекты не имееют инициализации по умолчанию (таки взглянул в стандарт).
Добавлено: 25 окт 2006, 14:56
tiasur
aissp писал(а):Ну значит стандарт не гарантирует или компилятор не удовлетворяет стандарту. Ну либо я дятел, что тоже вполне возможно.+)
Я пробовал на VC++ 6.0
Ну ты присылай если чего, хоть освежу в памяти то чем практически никогда не пользуюсь=)
Да пожалуйста:
Код: Выделить всё
int *array(int n)
{
return new int(n);
}
int main()
{
int *p = array(10);
for( int i = 0; i < 10; i++ )
{
p[i] = 0;
}
printf( "%d\n", p[0] );
p = array(10);
printf( "%d\n", p[0] );
return 0;
}
Tут помимо всеобшей тупизны ничего особенного не замечаю. Ну разве что memory leakage.
Добавлено: 25 окт 2006, 15:11
sz
aissp писал(а):Вообще то 0 там будут, благо инт (вот могу соврать но вроде еще помнб стандарт) обязан проинициализироваться нулем.
Обязан только для глобальных данных. На стеке никто никому ничего не обязан.
Добавлено: 25 окт 2006, 15:13
sobomax
tiasur писал(а):Да пожалуйста:
Код: Выделить всё
int *array(int n)
{
return new int(n);
}
int main()
{
int *p = array(10);
for( int i = 0; i < 10; i++ )
{
p[i] = 0;
}
printf( "%d\n", p[0] );
p = array(10);
printf( "%d\n", p[0] );
return 0;
}
Tут помимо всеобшей тупизны ничего особенного не замечаю. Ну разве что memory leakage.
Во втором printf p[0] не был проинициилизирован до обращения к нему.
-Maxim