Форум программистов, компьютерный форум CyberForum.ru

Локальные переменные-классы - C++

Восстановить пароль Регистрация
 
happy_robot
0 / 0 / 0
Регистрация: 12.09.2013
Сообщений: 4
12.09.2013, 10:35     Локальные переменные-классы #1
есть такой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
using namespace std;
 
class My_vector{
friend ostream &operator<<(ostream &,const My_vector &);
public:
  My_vector(int);
  ~My_vector();
  double &operator[](int) const;
private:
  int size;
  double *ptr;
};
 
My_vector::My_vector(int s){
  size=s;
  ptr=new double[s];
  for(int i=0;i<s;i++) ptr[i]=0;
}
 
My_vector::~My_vector(){
  delete[] ptr;
}
 
My_vector f(My_vector x){
  My_vector v(10);
  for(int i=0;i<10;i++)v[i]=i*i;
  return v;
}
 
int main(){
  My_vector a(10),b(10);
  a=f(b);   //!!!!!!!!!! 
  return 0;
}
Почему не выдает ошибку? В f(My_vector) создается локальная переменная v. Она возвращается из функции. При возврате из функции происходит побитовое копирование a=f(b); (a.ptr == на v.ptr, но v при выходе из функции уничтожается). Должна сработать ошибка, так как a.ptr указывает на освобожденную память. Что не так?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
12.09.2013, 10:39     Локальные переменные-классы #2
можно сравнить с этой функцией:
C++
1
2
3
4
5
int f()
{
    int a = 10;
    return a;
}
Почему не выдает ошибку? В f создается локальная переменная a. Она возвращается из функции
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
12.09.2013, 10:39     Локальные переменные-классы #3
Вы возвращаете экземпляр класса целиком - скопировав его в 'a' перед удалением

другое дело если бы было так

C++
1
2
3
4
5
6
7
My_vector* f(My_vector x){
  My_vector v(10);
  for(int i=0;i<10;i++)v[i]=i*i;
  return &v;
}
 
My_vector* a=f(b);
scotty
28 / 28 / 1
Регистрация: 09.09.2012
Сообщений: 131
12.09.2013, 10:42     Локальные переменные-классы #4
а ты уверен что деструктор срабатывает именно тогда?)) попробуй удали отдельной ф-ей с исп. указателем на класс, а потом увидешь ошибку при чтении.
happy_robot
0 / 0 / 0
Регистрация: 12.09.2013
Сообщений: 4
12.09.2013, 10:55  [ТС]     Локальные переменные-классы #5
Цитата Сообщение от ___ Посмотреть сообщение
можно сравнить с этой функцией:
C++
1
2
3
4
5
int f()
{
    int a = 10;
    return a;
}
Почему не выдает ошибку? В f создается локальная переменная a. Она возвращается из функции
Да,я понимаю что возвращается значение a. В моем примере происходит побитовое копирование всего объекта v, а также v.ptr. Получаю, что a.size=v.size,a.ptr=v.ptr - с этим согласен. Затем v удаляется, а также удаляется область памяти на которую указывает v.ptr. Т.е. a.ptr после завершения функции указывает на освобожденную область памяти и тут должна появиться ошибка. Хотя бы при завершении main когда будет срабатывать деструктор a, который попытается освободить уже освобожденную память с помощью delete[]. Но ошибку не показывает.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
12.09.2013, 10:59     Локальные переменные-классы #6
Цитата Сообщение от happy_robot Посмотреть сообщение
указывает на освобожденную область памяти и тут должна появиться ошибка
указывать можно куда угодно - указатель это своего рода просто unsigned int
C++
1
void* a = (void*)0x00000000;
happy_robot
0 / 0 / 0
Регистрация: 12.09.2013
Сообщений: 4
12.09.2013, 11:01  [ТС]     Локальные переменные-классы #7
Цитата Сообщение от Raali Посмотреть сообщение
указывать можно куда угодно - указатель это своего рода просто unsigned int
C++
1
void* a = (void*)0x00000000;
А как же деструктор при завершении main? delete []ptr должен дать ошибку, когда ptr указывает на куда угодно
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11807 / 6786 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
12.09.2013, 11:04     Локальные переменные-классы #8
Цитата Сообщение от happy_robot Посмотреть сообщение
Почему не выдает ошибку?
Луна в какой фазе?


Если утешит, то:
Локальные переменные-классы
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
12.09.2013, 11:04     Локальные переменные-классы #9
Цитата Сообщение от happy_robot Посмотреть сообщение
А как же деструктор при завершении main? delete []ptr должен дать ошибку, когда ptr указывает на куда угодно
должен по сути xD не знаю почему так
happy_robot
0 / 0 / 0
Регистрация: 12.09.2013
Сообщений: 4
12.09.2013, 11:07  [ТС]     Локальные переменные-классы #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Луна в какой фазе?


Если утешит, то:
Вложение 306454
Спасибо. Тогда проблема в компиляторе видимо... бэлин.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
12.09.2013, 11:09     Локальные переменные-классы #11
Цитата Сообщение от happy_robot Посмотреть сообщение
Спасибо. Тогда проблема в компиляторе видимо... бэлин.
может дебаг так сработал, попробуйте release версию (если конечно, и так не release)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2013, 11:13     Локальные переменные-классы
Еще ссылки по теме:

C++ Неинициализированные локальные переменные warning C4700
C++ Asm локальные переменные, объявленные в c++
C++ Локальные, глобальные переменные и функции

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11807 / 6786 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
12.09.2013, 11:13     Локальные переменные-классы #12
Цитата Сообщение от happy_robot Посмотреть сообщение
Спасибо. Тогда проблема в компиляторе видимо... бэлин.
Просто это UB
Yandex
Объявления
12.09.2013, 11:13     Локальные переменные-классы
Ответ Создать тему
Опции темы

Текущее время: 17:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru