当函数需要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,streamsize n)
不接受智能指针作为输入?任何技巧?
编辑:我正在尝试写这样的东西:
shared_ptr<char[]> readInBuffer(new char[fileLength]);
dictFile.read(readInBuffer.get(), fileLength);
但它不会编译。
答案 0 :(得分:5)
不是使用指针,而是使用向量。
std::vector<char> readInBuffer(fileLength);
dictFile.read(&readInBuffer[0], fileLength);
答案 1 :(得分:2)
大胖警告:创建指向数组的shared_ptr
会引发未定义的行为,因为智能指针会delete
指针,而不是delete[]
它。改为使用vector
!
将此留在此处是因为它可以作为一个有用的警告。原始答案如下......
get()
函数返回基础原始指针。你已经在代码中写了这个!
shared_ptr<char> readInBuffer(new char[fileLength]);
dictFile.read(readInBuffer.get(), fileLength);
使用&*readInBuffer
可以获得相同的结果。
当然,你必须确定dictFile.read()
没有delete
指针,或者恶魔可能会飞出你的鼻子。
答案 2 :(得分:1)
不,你不能传递shared_ptr
。但是你可以创建一个,并调用它的get()
成员函数来获取传递给函数的原始指针的副本。但是,shared_ptr
不处理数组;这就是vector
的用途。但您可以使用unique_ptr
数组来管理该对象:
std::unique_ptr<char[], std::default_delete<char[]> ptr(new char[whatever]);
f(ptr.get());
写第一行的方式可能更短,但我没有时间去挖掘它。