Is it safe to realloc memory allocated with new?

前端 未结 9 672
孤街浪徒
孤街浪徒 2020-12-02 17:12

From what is written here, new allocates in free store while malloc uses heap and the two terms often mean the same thing.

<
相关标签:
9条回答
  • 2020-12-02 17:34

    You may be able to (not in all cases), but you shouldn't. If you need to resize your data table, you should use std::vector instead.

    Details on how to use it are listed in an other SO question.

    0 讨论(0)
  • 2020-12-02 17:37

    That is not safe. Firstly the pointer you pass to realloc must have been obtained from malloc or realloc: http://en.cppreference.com/w/cpp/memory/c/realloc.

    Secondly the result of new int [3] need not be the same as the result of the allocation function - extra space may be allocated to store the count of elements.

    (And for more complex types than int, realloc wouldn't be safe since it doesn't call copy or move constructors.)

    0 讨论(0)
  • 2020-12-02 17:39

    It is not safe, and it's not elegant.

    It might be possible to override new/delete to support the reallocation, but then you may as well consider to use the containers.

    0 讨论(0)
  • 2020-12-02 17:39

    These function is mostly used in C.

    memset sets the bytes in a block of memory to a specific value.

    malloc allocates a block of memory.

    calloc, same as malloc. Only difference is that it initializes the bytes to zero.

    In C++ the preferred method to allocate memory is to use new.

    C: int intArray = (int*) malloc(10 *sizeof(int)); C++: int intArray = new int[10];

    C: int intArray = (int*) calloc(10 *sizeof(int)); C++: int intArray = new int10;

    0 讨论(0)
  • 2020-12-02 17:43

    In general, don't do that. If you are using user defined types with non-trivial initialization, in case of reallocation-copy-freeing, the destructor of your objects won't get called by realloc. The copy constructor won't be called too, when copying. This may lead to undefined behavior due to an incorrect use of object lifetime (see C++ Standard §3.8 Object lifetime, [basic.life]).

    1 The lifetime of an object is a runtime property of the object. An object is said to have non-trivial initialization if it is of a class or aggregate type and it or one of its members is initialized by a constructor other than a trivial default constructor. [ Note: initialization by a trivial copy/move constructor is non-trivial initialization. —end note ]

    The lifetime of an object of type T begins when:

    — storage with the proper alignment and size for type T is obtained, and

    — if the object has non-trivial initialization, its initialization is complete.

    The lifetime of an object of type T ends when:

    — if T is a class type with a non-trivial destructor (12.4), the destructor call starts, or

    — the storage which the object occupies is reused or released.

    And later (emphasis mine):

    3 The properties ascribed to objects throughout this International Standard apply for a given object only during its lifetime.

    So, you really don't want to use an object out of its lifetime.

    0 讨论(0)
  • 2020-12-02 17:43

    Yes - if new actually called malloc in the first place (for example, this is how VC++ new works).

    No otherwise. do note that once you decide to reallocate the memory (because new called malloc), your code is compiler specific and not portable between compilers anymore.

    (I know this answer may upset many developers, but I answer depends on real facts, not just idiomaticy).

    0 讨论(0)
提交回复
热议问题