【发布时间】:2016-07-22 08:17:45
【问题描述】:
我正在编写一个字符串类MyString(是的,作为家庭作业)并且必须提供一个返回unique_ptr<char[]>(而不是Vector)的toCString 方法。不幸的是,当将指针返回给调用者时我失败了:结果总是充满了错误的内容 - 似乎我在堆栈上创建了指针和/或字符数组。
unique_ptr<char[]> MyString::toCString() const {
char *characters = new char[m_len];
char *thisString = m_string.get();
for (int i = 0; i < m_len; i++) {
characters[i] = *(thisString + m_start + i);
}
const unique_ptr<char[], default_delete<char[]>> &cString = unique_ptr<new char[m_len]>(characters);
return cString;
}
在调试时,我总是得到预期的行为。问题仅发生在呼叫者站点上。我的错在哪里?
【问题讨论】:
-
为什么要返回智能指针? C 字符串只是指向
char(而不是数组)的指针 -
unique_ptr<new char[m_len]>(characters)这没有意义,也无法编译。显示您的实际代码。 -
您在堆栈上分配智能指针作为引用,然后退出函数。即使该行为似乎是正确的,这也会产生不可预测的行为。 stackoverflow.com/questions/10643563/…
-
@NathanielJohnson 该函数按值返回-正如您引用的文章所推荐的那样。它不返回引用或指向局部变量的指针。问题出在其他地方。
-
它是参考而不是副本。