Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Заблокирован
1

На какой адрес указывает указатель?

17.09.2015, 15:42. Показов 743. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день !

Подскажите пожалуйста , почему при такой записи от компилятора не получаю ошибку ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
value class Message
{
public:
    int x;
 };
 
int main(array<System::String ^> ^args)
{
    Message P3; 
    Message *P4=&P3; 
    Message ^P5=%P3;  //????????????????????????????????
    cout<<"\n*************************\n";
    return 0;
}
адрес который хранят указатели P4 и P5 не совпадает.

что за адрес хранится в P5 ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2015, 15:42
Ответы с готовыми решениями:

Как определить на какой тип памяти указывает указатель?
Всем привет! Народ, подскажите плиз, как можно в коде определить на какую область памяти...

Если указатель хранит адрес ячейки памяти, на которую он указывает, то почему тогда в моем экспериментальном коде такой результат?
Добрый день! Вот второй день разбираюсь с указателями и ссылками, и всё равно не могу заполнить...

В какой области памяти хранится указатель (сама переменная, которая хранит адрес)?
Привет! В общем у меня возник небольшой вопрос :) Если мы объявляем указатель, выделяем ему...

Указатель а (типа int) был с адресом "1С96", вопрос — Какой адрес станет у а, после а+=2?
вопрос значит вот какой: Указатель а (типа int) был с адресом &quot;1С96&quot; , вопрос - Какой адрес станет...

15
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
23.09.2015, 13:57 2
Цитата Сообщение от RAFA91 Посмотреть сообщение
что за адрес хранится в P5 ?
Могу ошибаться, но видимо это адрес экземпляра структуры Message, но в упакованном виде - в куче.
0
Заблокирован
23.09.2015, 16:10  [ТС] 3
я же не кидал P3 в упр. кучу.
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
23.09.2015, 16:27 4
Цитата Сообщение от RAFA91 Посмотреть сообщение
я же не кидал P3 в упр. кучу.
Здесь я не буду утверждать, но раз речь идёт о экземпляре структуры, для которой выделяют отдельную переменную в куче, вполне резонно говорить о упаковке/распаковке.
0
Заблокирован
23.09.2015, 16:58  [ТС] 5
P3 в стеке и в куче лежит ?
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
23.09.2015, 17:40 6
RAFA91, я не собираюсь разжёвывать вам любую ерунду, которая вам вдруг стала непонятной.
Я разбираюсь с вопросом вместе с вами, а не вместо вас.
Если вы не утрудились прочитать про упаковку и распаковку или, если вы знаете ответ или где его взять, но изощрённо меня испытываете - увольте, мне это удовольствие не нужно.
0
Заблокирован
24.09.2015, 13:36  [ТС] 7
ладно. пока ограничимся тем , что на данном этапе нам пофиг где лежит обьект.
0
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,238
24.09.2015, 15:01 8
Цитата Сообщение от RAFA91 Посмотреть сообщение
что за адрес хранится в P5 ?
познакомьтесь с отслеживающимися ссылками:
https://msdn.microsoft.com/ru-... 3062a.aspx

Цитата Сообщение от RAFA91 Посмотреть сообщение
я же не кидал P3 в упр. кучу.
вы - не кидали,а компилятор взял и создал в управляемой куче объект и вернул его адрес.
Вам правильно говорят, читайте про упаковку и распаковку.
0
Заблокирован
24.09.2015, 16:36  [ТС] 9
Решил протестировать такую штуку.

из func_3() возвращаю ссылку (в противном случае не работает)

эта ссылка присваивается ссылке K функции мейн.

C#
1
Message %K=func_3();
в функции func_3() создаю обьект
C#
1
Message A(89);
при выходе обьекта за пределы функции func_3() получаю вызов деструктора.

____________________________________

теперь собственно вопрос :

на что указывает ссылка K если был вызов деструктора ?

почему ссылка K позволяет изменять значение х с помощью метода func_2() и это значение изменяется .

она что активна ?

в чистом с++ это бы не работало.

___________________________________

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
36
#include "stdafx.h"
#include <iostream>
 
using namespace System;
using namespace std;
 
ref class Message
{
    int x;
public:
    Message()  {}
    Message(int a) : x(a) {Console::WriteLine("Конструктор");}
    ~Message()  {Console::WriteLine("Деструктор");}
    int func_1() {return x;}
    void func_2(int x) {Message::x=x;}
};
 
Message % func_3() ;
 
int main(array<String ^> ^args)
{
    
    Message %K=func_3();
    Console::WriteLine("x = {0}",K.func_1());
    K.func_2(5);
    Console::WriteLine("x = {0}",K.func_1());
    return 0;
}
 
Message % func_3() 
    {
        Console::WriteLine("++++++++++++++++++++++");
        Message A(89);
        Console::WriteLine("** x = {0}",A.func_1());
        return A;
    }
Миниатюры
На какой адрес указывает указатель?  
0
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,238
24.09.2015, 18:39 10
RAFA91,хороший вопрос...надо ждать знатоков.

P.S. НЕ возвращайте адрес локальной переменной. Здесь это прошло,а если бы переменные хранились в стеке переменная могла потом принять другое значение.
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
24.09.2015, 21:46 11
Цитата Сообщение от RAFA91 Посмотреть сообщение
на что указывает ссылка K если был вызов деструктора ?
Вызов деструктора в управляемой среде не гарантирует немедленное удаление объекта. До тех пор, пока сборщик мусора не подберёт этот экземпляр, он будет лежать в памяти.
Также, вызов деструктора не форсирует вызов сборщика мусора, он лишь делает экземпляр доступным для сборки.
GC во многом живёт своей жизнью. Более того, даже вызов GC::Collect() не гарантирует немедленного вызова сборщика мусора.
Такое прокатит не со всеми типами - многие при любом обращении к ним после вызова деструктора или метода Dispose() будут выбрасывать ObjectDisposedException.

Не по теме:

Цитата Сообщение от S_el Посмотреть сообщение
надо ждать знатоков.
Тоже жду, вопрос с подвохом, может и я не прав.

0
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,238
24.09.2015, 22:32 12
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Тоже жду, вопрос с подвохом, может и я не прав.
Вы правы. Сборщик мусора очищает память когда захочет и перемещает объекты по куче как хочет.
Подвох в том,что здесь память выделяется непонятно как(хитрое взаимодействие с кучей). Если заменить такое выделение,на
C++
1
2
3
Message ^A = gcnew Message(89);
...
return *A;
и определить финализатор,то мы увидим что все отработает как надо: в самом конце он вызовется. При таком определении как у ТС финализатор задействован не будет.
Если переделать класс под value то работать будет аналогично с обычным C++: стек будет перезатерт после некоторого другого действия.

Не по теме:

Говорят C++ сложный,это они с C++/CLI не сталкивались :D

0
tezaurismosis
24.09.2015, 22:36
  #13

Не по теме:

Цитата Сообщение от S_el Посмотреть сообщение
это они с C++/CLI не сталкивались
Ага. Это по плюсам куча книг со всеми тонкостями и огромное комьюнити. А по C++/CLI - неуклонно устаревающая и неполная документация, 3 более-менее читаемые книги и полтора пользователя в разделе :jokingly:

0
Заблокирован
25.09.2015, 12:10  [ТС] 14
Цитата Сообщение от S_el Посмотреть сообщение
с под value то работать будет аналогично с обычным C++:
а ни че , что в value классе нельзя обьявить деструктор и оператор = как в чистом с++
0
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,238
25.09.2015, 12:15 15
Цитата Сообщение от RAFA91 Посмотреть сообщение
а ни че , что в value классе нельзя обьявить деструктор и оператор = как в чистом с++
мне вы это зачем говорите? Вы текст читайте полностью,а не куски выдергивайте:
Цитата Сообщение от S_el Посмотреть сообщение
Если переделать класс под value
0
Заблокирован
26.09.2015, 16:04  [ТС] 16
ПОЧЕМУ в value классе нельзя написать свой оператор = ?
0
26.09.2015, 16:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.09.2015, 16:04
Помогаю со студенческими работами здесь

Частный адрес, динамический адрес, статический адрес - какой у меня?
Привет. Открываем рубрику глупых вопросов. Я сижу с компьютера который подключен к интернету по...

Объявить в классе-наследнике указатель, указывающий туда же, куда указывает указатель в классе-родителе
Здравствуйте. Имеется базовый класс MainWindow: #ifndef MAINWINDOW_H #define MAINWINDOW_H...

Сохранить адрес из указателя в другой указатель, а потом первый указатель удалить
Добрый день всем. Возмём простейший пример: #include &lt;iostream&gt; using namespace std; int...

Узнать указывает ли указатель
Доброго времени суток. Постановка задачи такова: есть указатель на массив, надо удалить массив, а...

Указатель не указывает на CHAR
Доброго всем здравия, совсем запутался, написал примитивный код, а он гад не работает. Как такое...

Указатель куда указывает?
Вопрос в комментарии к программе int main() { int count = 0; char str = &quot;atutau&quot;; char...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru