5

当函数需要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();

当然,如果在 delete[] 语句之前抛出异常,则存在内存泄漏。我想知道是否可以使用 shared_ptr readInBuffer(new char[fileLength]); 但是函数原型

读取 ( char* s, 流大小 n )

不接受智能指针作为输入?有什么技巧吗?

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

shared_ptr<char[]> readInBuffer(new char[fileLength]);
dictFile.read(readInBuffer.get(), fileLength);

但它不会编译。

4

3 回答 3

6

除了使用指针,您还可以使用向量。

std::vector<char> readInBuffer(fileLength);
dictFile.read(&readInBuffer[0], fileLength);
于 2012-11-15T19:59:58.183 回答
5

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

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

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

shared_ptr<char[]> readInBuffer(new char[fileLength]);
dictFile.read(readInBuffer.get(), fileLength);

使用 可以达到相同的结果&*readInBuffer

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

于 2012-11-15T20:03:21.907 回答
1

No, you can't pass a shared_ptr. But you can create one, and call its get() member function to get a copy of the raw pointer to pass to the function. However, a shared_ptr doesn't deal with arrays; that's what vector is for. But you can use a unique_ptr to an array to manage that object:

std::unique_ptr<char[], std::default_delete<char[]> ptr(new char[whatever]);
f(ptr.get());

There may be a shorter way to write that first line, but I don't have time to dig it out.

于 2012-11-15T20:06:01.530 回答