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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
happy_robot
0 / 0 / 0
Регистрация: 12.09.2013
Сообщений: 4
#1

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

12.09.2013, 10:35. Просмотров 529. Ответов 11
Метки нет (Все метки)

есть такой код
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 указывает на освобожденную память. Что не так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2013, 10:35     Локальные переменные-классы
Посмотрите здесь:

Локальные переменные - C++
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; // по объявлению библиотек сразу видно компилятор старый такчто ветераны с++ помогите ...

Неинициализированные локальные переменные - C++
Меня интересует как обходить данные ошибки. В чем соль ошибок? Проблема даже не в том что они есть, а то что компилятор останавливается и...

Неиспользуемые локальные переменные - C++
Добрый день. Напомните, пожалуйста, вот что. Имеем, например: void MyClass::myFunc() { SomeClass *cls = new SomeClass(); ...

С++ ООП локальные переменные - C++
Есть розмерность для матрицы n i m, если я ввожу их в функции create, то уже функция print их не видит.я понимаю что они локальные, как же...

Локальные, глобальные переменные и функции - C++
Есть массив типа char. char b; Он заполнен нулями и единицами. b находится в main. Нужно вывести на консоль b в ф-ции main, но уже в...

Variadic templates локальные переменные - C++
Еще один вопрос по Variadic templates. Решаю следующую задачу: Необходимо сохранить в памяти функцию с набором параметров для...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 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
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 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
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
12.09.2013, 11:04     Локальные переменные-классы #8
Цитата Сообщение от happy_robot Посмотреть сообщение
Почему не выдает ошибку?
Луна в какой фазе?


Если утешит, то:
Локальные переменные-классы
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 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
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 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++
Привет! Пишу функцию перевода десятичного числа в текст (не обсуждайте зачем и правильно ли я делаю) Суть такова, начало функции: ...

Asm локальные переменные, объявленные в c++ - C++
//------------------------------------------------------------------------------------------------- TLongInteger TLongInteger:: ...

Неинициализированные локальные переменные warning C4700 - C++
// Laboratornaa.cpp: определяет точку входа для консольного приложения. // #include&quot;stdafx.h&quot; #include&lt;iostream&gt; ...

как в Code::Blocks просмотреть локальные переменные? - C++
знаю, что можно, а как - не знаю :( Добавлено через 15 часов 11 минут up...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru