shared_ptr用于原始指针参数

dig*_*ber 4 c++ pointers function smart-pointers

当函数需要char*时,你能传入一个shared_ptr吗?

我正在读取整个文本文件(长度= 100),并希望将char存储到char []数组中.我使用的天真的方式是这样的:

ifstream dictFile(fileName);
size_t fileLength = 100;
char* readInBuffer(new char[fileLength]);
dictFile.read(readInBuffer, fileLength);
//processing readInBuffuer..............
delete[] readInBuffer;
dictFile.close();
Run Code Online (Sandbox Code Playgroud)

如果在delete []语句之前抛出异常,则会发生内存泄漏.我想知道我是否可以使用shared_ptr readInBuffer(new char [fileLength]); 但功能原型

读(char*s,streamsize n)

不会接受智能指针作为输入?任何招数?

编辑:我正在尝试写这样的东西:

shared_ptr<char[]> readInBuffer(new char[fileLength]);
dictFile.read(readInBuffer.get(), fileLength);
Run Code Online (Sandbox Code Playgroud)

但它不会编译.

Mar*_*som 5

您可以使用向量来代替使用指针.

std::vector<char> readInBuffer(fileLength);
dictFile.read(&readInBuffer[0], fileLength);
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 5

大警告:创建std::shared_ptr<char>指向数组的 a 会引发未定义的行为,因为智能指针将delete指向指针,而不是delete[]它。用一个std::shared_ptr<char[]>代替!

把它留在这里是因为它可能作为一个有用的警告。原答案如下...

get()函数返回底层原始指针。你已经在你的代码中写了这个!

shared_ptr<char[]> readInBuffer(new char[fileLength]);
dictFile.read(readInBuffer.get(), fileLength);
Run Code Online (Sandbox Code Playgroud)

使用 可以实现相同的结果&*readInBuffer

当然,你必须确定那dictFile.read()不是delete指针,否则恶魔可能会从你的鼻子里飞出来。