Страница 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
А чего тогда спрашиваеш?
Выдает ошибку когда в конце освобождаю память:

Код: Выделить всё

strMe.~MyStruct();
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