C ++ memory allocation

When using C ++, if there is a class:

class MyClass
{
    char memory1bye;
    int memory4bytes;
    int another4bytes;
};

this class uses a total of 9 bytes in memory ... so if I do something like:

MyClass *t1;

This will give me a useful address for the class, but will it allocate 9 bytes? And will it call the default constructor? Or do I need to combine these 9 bytes into a class? If then I called something like:

t1 = (MyClass *)new MyClass;

would it be considered a memory leak? In other words, what happens to the old address?

+3
source share
9 answers
  • , MyClass . , , , . 32- - 12 ; , 4- .

    64- , , 24 (.. 8- ). , - - , 8- , , , 8- . (NB: , !)

    , , sizeof(MyClass). - ++, new . , , ( char) , .

  • MyClass *t1; . ( , MyClass). la-la land, . , , NULL, , , -.

  • t1 = (MyClass *)new MyClass; , new . t1 = new MyClass; .

  • t1 , , ( , ++ ). - , . - , NULL, .

    , ; .

    , ( MyClass t1;) , ; , . , , . ( , ). , ( , , , , Java , , ++).

+2
  • , .
  • MyClass *t1 . undefined .
  • t1 = (MyClass *)new MyClass; . , delete, . , , t1 = new MyClass(); .

: .

MyClass *t1 = NULL; 

MyClass -, . , 0. ,

t1 = new MyClass();

new MyClass t1. t1:

t1->doStuff();

, :

MyClass *t2 = t1;

t2 t1 . , :

delete t1;

(delete t2 ). , ( ).

t2->doStuff();

delete undefined. , :

t1 = NULL;
t2 = NULL;

, , delete. . , , , . RAII.

+14

, . new . , .

, , ++ , , (std::vector, std:: deque ..) , .

+4
MyClass* t1;

MyClass. - , MyClass, , .

(, , , .)

t1 = (MyClass*)new MyClass;

MyClass. , , , :

MyClass t;  // who needs a pointer?

. , , , , {}.

, , ( / ). :

t1 = new MyClass;

- - MyClass *... , , .

t1.

MyClass 9 .. , , , ..

+2

:

  • "" :

  • , ++. C-, , (, , ) ++:

    • dynamic_cast<type>()
    • static_cast<type>()
    • reinterpret_cast<type>()

. ++ - ++

+2

, MyClass 9 , !

MyClass * t1;

, . , : .

, , . , , MyClass *:

MyClass t1();

, t1 .

  • : stack.
+1

-

MyClass *t1;

MyClass. - . , :

MyClass t2;                  // this calls a default constructor implicitly
MyClass t3 = MyClass();      // this also calls a default constructor explicitly
MyClass *t4 = new MyClass;   // calls default constructor implictly

, . , :

MyClass t5(arg1, arg2, arg3);
MyClass t6 = MyClass(arg1, arg2, arg3);
MyClass *t7 = new MyClass(arg1, arg2, arg3);
+1

- , 9 .

- MyClass *ptr "MyClass" . - "MyClass" . , , , (, ), .

- , "MyClass"

. , 'm' MyClass

MyClass m; 
ptr = &m;       // this does not create any new object(no constructor runs)

MyClass *ptr;
ptr = new MyClass();  // This new expression, allocates memory large 
                      // enough to hold a 'MyClass' object, initializes
                      // the object by running it constructor

delete ptr;           // delete the MyClass object by running it 
                      // destructor, return the allocated memory back
                      // to the implementation

- "ptr" ,

+1

9 . , , , .

MyClass * t1; . , , , . MyClass . , :

MyClass *t1 = 0;   // use 0, NULL, or null_ptr

. "" .

MyClass *t1 = new MyClass();

Do not forget that you need to "delete" to match each new one, otherwise you will write a memory leak.

0
source

Source: https://habr.com/ru/post/1764839/


All Articles