When the function requires a char*, can you pass in a shared_ptr?
I’m reading in a whole text file (length = 100), and want to store the char’s into a char[] array. The naive way I used was this:
ifstream dictFile(fileName);
size_t fileLength = 100;
char* readInBuffer(new char[fileLength]);
dictFile.read(readInBuffer, fileLength);
//processing readInBuffuer..............
delete[] readInBuffer;
dictFile.close();
Of course there is memory leak if an exception is thrown before the delete[] statement. I’m wondering if I can use
shared_ptr readInBuffer(new char[fileLength]);
But the function prototype
read ( char* s, streamsize n )
won’t accept a smart pointer as input? Any tricks?
Edit: I’m trying to write something like this:
shared_ptr<char[]> readInBuffer(new char[fileLength]);
dictFile.read(readInBuffer.get(), fileLength);
But it won’t compile.
BIG FAT WARNING: creating a
std::shared_ptr<char>that points to an array provokes undefined behaviour, because the smart pointer willdeletethe pointer, notdelete[]it. Use astd::shared_ptr<char[]>instead!Leaving this here because it might serve as a useful warning. Original answer follows…
The
get()function returns the underlying raw pointer. You already wrote this in your code!The same result can be achieved with
&*readInBuffer.Of course, you have to be certain that
dictFile.read()doesn’tdeletethe pointer, or demons might fly out of your nose.