DEV Community

Calin Baenen
Calin Baenen

Posted on

Is there a way to convert dynamically allocated memory to static memory OR copy ptr contents in C/C++?

For reference, static memory is memory that is memory that is assigned, managed, and freed for you (an example is char const* str = "Hello World!";).
C/C++ will clean that string up for you.

Dynamically allocated memory is memory you request, manage, and must clean yourself (an example is Type_t* array = malloc( sizeof(Type_t)*arrLength );).

I'm messing around with C strings in C++, even testing ideas for my own String type. - And I was creating a String +(char c) method, when I thought of something: "How can I return a String object whose str property is statically allocated, and not dynamically allocated?".
Since the only method of adding a character to an immutable string I can think of involves using malloc( (oldStrLen+1)*sizeof(char) ), which is dynamically allocated.

So, is there a way I can copy the contents of a pointer to a new statically allocated pointer, or convert dynamically allocated memory to statically allocated memory in C/C++?


Discussion (7)

pgradot profile image
Pierre Gradot

We don't use malloc() in C++.

Since C++11, we avoid new as much as possible. Instead, we use smart pointers.

Except for educational purposes, you should use std::string.

Since we don't know that your custom String class looks like, it's almost impossible to answer your question. Nevertheless, the answer is probably "no" ;)

baenencalin profile image
Calin Baenen Author

Since we don't know that your custom String class looks like, it's almost impossible to answer your question.

Well, the best way to describe it is a C++ programmer's poor-man's Java String.
But, does this help answer my question?

pgradot profile image
Pierre Gradot

There is so much to say about this code... Some remarks:

1- Why mixing char* and unsigned char*?
2- Why usig unsigned char? oO
3- this-> is not needed, most of the time
4- I see getlen(std::string) --> why don't you simply use std::string? Is this code only for educational purpose?
5- getlen(unsigned char const*) : aren't you missing ++i in the for loop?
6- Don't use C style casts. Use C++ cast operators
7- unsigned char const* const str = nullptr; --> why is this pointer const?! You want to set it in the constructor Oo

Thread Thread
baenencalin profile image
Calin Baenen Author

Note: What's with the two random "Oo"s?

1- Because I prefer unsigned char when working with characters, and unsigned char is compatible with char, but I don't know if it's compatible with signed char. Though, I guess I should just use char, huh?
2- For the reason stated above (I love unsigned characters).
3- I know, but since I work in the context of Java, and JavaScript, I prefer the this., because I've gotten attached to using it for properties.
4- I just wanted to make my own String type for fun, to add my own custom methods, without having to dig into the internals of the tradition std::string. - So, technically, I guess you could say so.
5- Yes. But it should be an i++ and not ++i. (Since won't the latter increment i before the loop begins?)
6- This was a deliberate decision. I realize they can cause errors, and allow too much freedom. - But, this decision is also in part to not understanding how C++'s typecasts work, and why they wouldn't just replace C's typecasts (if they were so bad). (I know, compatibility reasons, blah blah blah, but they still could have made it work, adding their own casts with (Type) value.)
7- I do. And I still can in the member-initializer-list, since those apparently happen before the instantiation of the class (or right as it happens).

Thread Thread
pgradot profile image
Pierre Gradot

NOTE: this is juste a smiley: Oo => => Surprised

1/2- Not everything is a matter a preference. See
3- Usually, we don't add this-> when its not needed. It improves codes' readability.*
4- OK
5- Both occur at the end of each iteration. In C++, we generally use ++i in for loops. See
6- If you don't understand the C++ cast operators, then you don't understand what you code do. You should really use them. See
7- My bad: it works in the initialization list. Note that you have a cast that takes away the const.

johnmper profile image
João Pereira

AFIK, you cannot convert dynamic memory in static or stack memory since both need to be known at compile time. You can move it into static memory but you would still need a buffer with a constant size to be prepared at compile time. Which means it won't be a "new" static memory

capz profile image

Static memory is not automatically cleaned up for you. It is globally shared memory and you will still need to clean it up, unless you mean at app exit, at which point more or less everything is cleaned up.

char const* my string = "";
Is not static, use std::string instead, seriously.

Also you can just make a std::string instance and assign the value of a pointer dereferenced string to it. Complex types require you copy your data to a new variable / memory block yourself. Memory management involving anything pointer that's not a smart pointer, is completely your responsibility.

For your moving memory behind a pointer question, probably std::move documentation will give you some insights.

By statically allocated pointer you mean a smart pointer, I assume? Pointers are just that, references to a block of memory. How you deal with that memory is your responsibility.

I would go as far as recommending to stay away from raw pointers and only use std:: types like smart pointers, they deal with a lot of difficult things like memory management and copy/move/manipulation of data in safe ways.