I\'m a student at university. I work mostly with Java, C++ is very new to me, so I probably make many silly mistakes and I have upcoming exams to cope with. Don\'t be too harsh
I think you are expecting the sizeof
operator to behave differently than it actually does. Let's take this code, for example:
const char* str = new char[137];
Here, if you write sizeof(str)
you'll probably either get 4 or 8, depending on your system, because sizeof(str)
measures the number of bytes of the pointer str
itself rather than the number of bytes in the array pointed at by str
. So, on a 32-bit system, you'd probably get 4, and on a 64-bit system you'd probably get 8, independently of how many characters you allocated.
Unfortunately, C++ doesn't have a way for you to get the number of characters or the memory used up by a dynamically allocated array. You just have to track that yourself.
Similarly, in your main function, when you write sizeof(p)
, you're measuring the number of bytes used by the object p
, not the total number of bytes used by p
and the arrays it points at. You'll always get back the same value for sizeof(p)
regardless of what strings it points at.
If you're planning on working with strings in C++, I strongly recommend using std::string
over raw C-style strings. They're much easier to use, they remember their length (so it's harder to mix up strlen
and sizeof
), and if you have a class holding s bunch of std::string
s you don't need a copy constructor or assignment operator to handle the logic to shuffle them around. That would significantly clean up your code and eliminate most of the memory errors in it.