C ++ Указатель на объекты -- c++ поле с участием object поле с участием pointers пол Связанный проблема

C++ pointer to objects


29
vote

проблема

русский

в C ++ У вас всегда инициализировать указатель на объект с new ключевое слово?

или вы просто имеете это тоже:

 <код> MyClass *myclass;  myclass->DoSomething();   

Я думал, что это был указатель, выделенный на стеке вместо кучи, но поскольку объекты обычно куча выделены, я думаю, что моя теория, вероятно, неисправна ??

Пожалуйста, совет.

Английский оригинал

In C++ do you always have initialize a pointer to an object with the new keyword?

Or can you just have this too:

MyClass *myclass;  myclass->DoSomething(); 

I thought this was a pointer allocated on the stack instead of the heap, but since objects are normally heap allocated, I think my theory is probably faulty??

Please advice.

</div
        
 
 

Список ответов

49
 
vote
vote
Лучший ответ
 

Нет, у вас могут быть указатели на выделенные объекты стека:

 <код> MyClass *myclass; MyClass c; myclass = & c; myclass->DoSomething();   

Это, конечно, обычно при использовании указателей как параметры функции:

 <код> void f( MyClass * p ) {     p->DoSomething(); }  int main() {     MyClass c;     f( & c ); }   

так или иначе, указатель всегда должен быть инициализирован. Ваш код:

 <код> MyClass *myclass; myclass->DoSomething();   

приводит к этому ужасному состоянию, <сильное> неопределенное поведение .

 

No, you can have pointers to stack allocated objects:

MyClass *myclass; MyClass c; myclass = & c; myclass->DoSomething(); 

This is of course common when using pointers as function parameters:

void f( MyClass * p ) {     p->DoSomething(); }  int main() {     MyClass c;     f( & c ); } 

One way or another though, the pointer must always be initialised. Your code:

MyClass *myclass; myclass->DoSomething(); 

leads to that dreaded condition, undefined behaviour.

</div
 
 
 
 
23
 
vote

Нет, вы не можете этого сделать, <код> MyClass *myclass определит указатель (память для указателя выделяется на стеке), который указывает на случайное местоположение памяти. Попытка использовать этот указатель приведет к неопределенному поведению.

в C ++, вы можете создавать объекты либо на стеке, либо куча, как это:

 <код> MyClass myClass; myClass.DoSomething();   

выше будет распределять myclass на стеке (термин не там в стандарте, я думаю, но я использую для ясности). Память, выделенная для объекта, автоматически выделяется, когда myClass переменная выходит из помещения.

Другой способ выделения памяти - сделать <код> new . В этом случае вы должны позаботиться о выпуске памяти, делая <код> delete самостоятельно.

 <код> MyClass* p = new MyClass(); p->DoSomething(); delete p;   

Восстановите <код> delete Часть, иначе будет утечка памяти.

Я всегда предпочитаю использовать распределенные объекты стека, когда это возможно, так как мне не нужно беспокоить о управлении памятью.

 

No you can not do that, MyClass *myclass will define a pointer (memory for the pointer is allocated on stack) which is pointing at a random memory location. Trying to use this pointer will cause undefined behavior.

In C++, you can create objects either on stack or heap like this:

MyClass myClass; myClass.DoSomething(); 

Above will allocate myClass on stack (the term is not there in the standard I think but I am using for clarity). The memory allocated for the object is automatically released when myClass variable goes out of scope.

Other way of allocating memory is to do a new . In that case, you have to take care of releasing the memory by doing delete yourself.

MyClass* p = new MyClass(); p->DoSomething(); delete p; 

Remeber the delete part, else there will be memory leak.

I always prefer to use the stack allocated objects whenever possible as I don't have to be bothered about the memory management.

</div
 
 
11
 
vote

Если вы хотите объект в стеке, попробуйте это:

 <код> void f( MyClass * p ) {     p->DoSomething(); }  int main() {     MyClass c;     f( & c ); } 0  

Если вам нужен указатель на этот объект:

 <код> void f( MyClass * p ) {     p->DoSomething(); }  int main() {     MyClass c;     f( & c ); } 1  
 

if you want the object on the stack, try this:

MyClass myclass; myclass.DoSomething(); 

If you need a pointer to that object:

MyClass* myclassptr = &myclass; myclassptr->DoSomething(); 
</div
 
 
2
 
vote

сначала мне нужно сказать, что ваш код,

 <код> void f( MyClass * p ) {     p->DoSomething(); }  int main() {     MyClass c;     f( & c ); } 2  

приведет к тому, что undefined поведение . Поскольку указатель «MyClass» не указывает на любые предметы типа «MyClass».

Здесь у меня есть три предложения для вас: -

Вариант 1: - Вы можете просто объявить и использовать объект типа MyClass на стеке, как показано ниже.

 <код> void f( MyClass * p ) {     p->DoSomething(); }  int main() {     MyClass c;     f( & c ); } 3  

Вариант 2: - , используя новый оператор.

 <код> void f( MyClass * p ) {     p->DoSomething(); }  int main() {     MyClass c;     f( & c ); } 4  

Три вещи будут скрываться здесь.

i) распределяет память для объекта типа «MyClass» на куче.

II) выделяет память для «MyClass» в типе указателя «MyClass» в стеке.

III) Указатель «MyClass» указывает на адрес памяти объекта типа «MyClass» на куче

Теперь вы можете использовать указатель на доступ Функции участника объекта после размытия указатель на "- & gt;"

 <код> void f( MyClass * p ) {     p->DoSomething(); }  int main() {     MyClass c;     f( & c ); } 5  

Но вы должны освободить память, выделенную на объект типа «MyClass» на кучу, прежде чем вернуться с объема, если вы не хотите, чтобы это существует. В противном случае это вызовет Утечка памяти !

 <код> void f( MyClass * p ) {     p->DoSomething(); }  int main() {     MyClass c;     f( & c ); } 6  

Вариант 3: - Вы также можете сделать, как показано ниже.

 <код> void f( MyClass * p ) {     p->DoSomething(); }  int main() {     MyClass c;     f( & c ); } 7  

Теперь указатель и объект оба находятся на стеке. Теперь вы не можете вернуть этот указатель на внешнюю часть текущей области, потому что оба выделенная память указателя, и объект будет освобожден при выходе за пределами объема области.

Так как сводка, опция 1 и 3 выделит объект на стеке, пока только параметр 2 будет делать это на куче.

 

First I need to say that your code,

MyClass *myclass; myclass->DoSomething(); 

will cause an undefined behavior. Because the pointer "myclass" isn't pointing to any "MyClass" type objects.

Here I have three suggestions for you:-

option 1:- You can simply declare and use a MyClass type object on the stack as below.

MyClass myclass; //allocates memory for the object "myclass", on the stack. myclass.DoSomething(); 

option 2:- By using the new operator.

MyClass *myclass = new MyClass(); 

Three things will hapen here.

i) Allocates memory for the "MyClass" type object on the heap.

ii) Allocates memory for the "MyClass" type pointer "myclass" on the stack.

iii) pointer "myclass" points to the memory address of "MyClass" type object on the heap

Now you can use the pointer to access member functions of the object after dereferencing the pointer by "->"

myclass->DoSomething(); 

But you should free the memory allocated to "MyClass" type object on the heap, before returning from the scope unless you want it to exists. Otherwise it will cause a memory leak!

delete myclass; // free the memory pointed by the pointer "myclass" 

option 3:- you can also do as below.

MyClass myclass; // allocates memory for the "MyClass" type object on the stack. MyClass *myclassPtr; // allocates memory for the "MyClass" type pointer on the stack. myclassPtr = &myclass; // "myclassPtr" pointer points to the momory address of myclass object. 

Now, pointer and object both are on the stack. Now you can't return this pointer to the outside of the current scope because both allocated memory of the pointer and the object will be freed while stepping outside the scope.

So as a summary, option 1 and 3 will allocate an object on the stack while only the option 2 will do it on the heap.

</div
 
 
 
 
1
 
vote

Если вы хотите получить доступ к способу:

1) При использовании объекта класса:

 <код> Myclass myclass; myclass.DoSomething();   

2) При использовании указателя на объект класса:

 <код> Myclass *myclass=&abc; myclass->DoSomething();   
 

if you want to access a method :

1) while using an object of a class:

Myclass myclass; myclass.DoSomething(); 

2) while using a pointer to an object of a class:

Myclass *myclass=&abc; myclass->DoSomething(); 
</div
 
 
1
 
vote

Если вы определили метод внутри вашего класса как статическое, это на самом деле возможно.

 <код>     class myClass     {     public:         static void saySomething()         {             std::cout << "This is a static method!" << std::endl;         }     };    

и от Main, вы объявляете указатель и попытаетесь вызвать статический метод.

 <код>     myClass * pmyClass;     pmyClass->saySomething();  /*     Output: This is a static method! */   

Это работает нормально, потому что статические методы не относятся к конкретному экземпляру класса, и они не выделяются как часть любого экземпляра класса.

Подробнее о статических методах здесь: http://en.wikipedia.org/wiki/static_method #Static_methods

 

If you have defined a method inside your class as static, this is actually possible.

    class myClass     {     public:         static void saySomething()         {             std::cout << "This is a static method!" << std::endl;         }     };  

And from main, you declare a pointer and try to invoke the static method.

    myClass * pmyClass;     pmyClass->saySomething();  /*     Output: This is a static method! */ 

This works fine because static methods do not belong to a specific instance of the class and they are not allocated as a part of any instance of the class.

Read more on static methods here: http://en.wikipedia.org/wiki/Static_method#Static_methods

</div
 
 
0
 
vote

Простое решение для литого указателя на объект

онлайн Demo

 <код> class myClass {   public:   void sayHello () {     cout << "Hello";   } };  int main () {   myClass* myPointer;   myClass myObject = myClass(* myPointer); // Cast pointer to object   myObject.sayHello();    return 0; }   
 

Simple solution for cast pointer to object

Online demo

class myClass {   public:   void sayHello () {     cout << "Hello";   } };  int main () {   myClass* myPointer;   myClass myObject = myClass(* myPointer); // Cast pointer to object   myObject.sayHello();    return 0; } 
</div
 
 

Связанный проблема

-1  C ++ DO В то время как проблемы с петлей [закрыто]  ( C do while loop issues ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

3  Отправка HTTP Post Запрос на обновление содержимого файла с использованием C ++ REST SDK Casablanca  ( Sending a http post request for updating file contents using c rest sdk casabl ) 
Я пытаюсь обновить содержимое файла на сервере Alfresco, используя C ++ SDK SDK. Я использую URL Alfresco CMIS URL для отправки запроса. Быть более конкретным...

1  Наличие проблемных проектов C ++ в Eclipse CDT в ОС X для глупой причины  ( Having trouble building c project in eclipse cdt in os x for a silly reason ) 
Я пытаюсь построить очень простую программу C ++ в Eclipse, и я получаю очень глупую ошибку: <код> **** Internal Builder is used for build **...

29  Добавление! Оператор и SQRT (), POW () и т. Д. Для пример примерка калькулятора  ( Adding the operator and sqrt pow etc to a calculator example applicatio ) 
Я делаю упражнения в новой книге Strustrup "Принципы программирования и практики с использованием C ++" и было интересно, если кто-нибудь на переполнении ст...

1  Шаблон статических классов через динамические связанные библиотеки  ( Template static classes across dynamic linked libraries ) 
У меня есть классовый класс со статическим значением, как это: <код> template <class TYPE> class A{ static TYPE value; }; в коде dll I назначаю ст...

-1  Приложение C ++ в массивах с использованием арифметического указателя  ( C app on arrays using pointer arithmetic ) 
Вопрос: как я могу генерировать случайное животное из массива, используя эту функцию? <код> const int MAX =12; //12 animals const int MAXSTR = 10; ...

-4  Петля, которая компилирует и работает в INT основной функции не скомпилируется при введении в отдельную функцию [закрыто]  ( Loop that compiles and runs in int main function wont compile when put into a se ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыто. Этот вопрос нуждается в Детали отладки . В настоящее вр...

1  Как работают Char и INT в C ++  ( How do char and int work in c ) 
Может быть, я собираюсь задать глупый вопрос, но я хочу подтвердить, как работает Char? Позвольте мне объяснить с примерами того, что я хочу спросить. Пусть п...

0  Правильный способ использования вариационного шаблона функции вызова со строковыми аргументами C ++  ( Proper way of using variadic template function call with string arguments c ) 
Здравствуйте, что не то, что я здесь делаю, используя вариадические шаблоны через строку? Как правильно использовать его для достижения заданий ниже? <код> ...

0  Как захватывать события, выпущенные из нового окна всплывающего  ( How to capture events fired from new popup ie window ) 
Приветствия! <Сильная> Ситуация: My ActiveX DLL содержит индивидуальный webbrowser. WebBrowser отображает веб-страницу. Когда пользователь нажимает на сс...

-1  Бросить исключение, когда неправильный тип введен в  ( Throw exception when a wrong type is keyed in ) 
Я должен написать программу C ++, в которой функция состоит в том, чтобы прочитать два номера double Тип чисел из клавиатуры и добавить <код> try BLOCK, чт...

14  Классы, Rvalues ​​и Rvalue Список  ( Classes rvalues and rvalue references ) 
Lvalue - это значение, связанное с окончательной областью памяти, тогда как rvalue - это значение выражения, существование которого является временным, а не о...

2  Создание хеша для данных больше, чем память (без зарядки)  ( Generating a hash for data larger than memory without getting arrested ) 
Добрый послеобеденный переполнец! ;) Что я хочу сделать: Я заинтересован в проверке передаваемой целостности файлов. Как я подошел к нему: Я рассм...

6  Singleton & Multi-Threading  ( Singleton multi threading ) 
У меня есть следующий класс <код> class Singleton { private: static Singleton *p_inst; Singleton(); public: static Singleton * instance()...

3  Как создавать закрытые зоны (выпуклые многоугольники) от набора сегментов линии?  ( How to create closed areas convex polygons from set of line segments ) 
Следующая проблема находится в 2D, поэтому некоторые упрощения могут быть сделаны при предложении ответов. Мне нужно создать закрытые области (определены ли...

Связанный проблема

-1  C ++ DO В то время как проблемы с петлей [закрыто] 
3  Отправка HTTP Post Запрос на обновление содержимого файла с использованием C ++ REST SDK Casablanca 
1  Наличие проблемных проектов C ++ в Eclipse CDT в ОС X для глупой причины 
29  Добавление! Оператор и SQRT (), POW () и т. Д. Для пример примерка калькулятора 
1  Шаблон статических классов через динамические связанные библиотеки 
-1  Приложение C ++ в массивах с использованием арифметического указателя 
-4  Петля, которая компилирует и работает в INT основной функции не скомпилируется при введении в отдельную функцию [закрыто] 
1  Как работают Char и INT в C ++ 
0  Правильный способ использования вариационного шаблона функции вызова со строковыми аргументами C ++ 
0  Как захватывать события, выпущенные из нового окна всплывающего 
-1  Бросить исключение, когда неправильный тип введен в 
14  Классы, Rvalues ​​и Rvalue Список 
2  Создание хеша для данных больше, чем память (без зарядки) 
6  Singleton & Multi-Threading 
3  Как создавать закрытые зоны (выпуклые многоугольники) от набора сегментов линии? 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.