- 主题:这个右值引用返回有问题? 为什么一运行就segmentation fault?
std::vector<std::string>&& get_cmp_files(const std::string& dir) {
std::vector<std::string> res;
DIR* dp;
struct dirent* dirp;
if ((dp = opendir(dir.c_str())) == nullptr) {
printf("打开文件夹失败: %s, %s\n", dir.c_str(), strerror(errno));
exit(-1);
}
while ((dirp = readdir(dp)) != nullptr) {
if (dirp->d_type == DT_REG) {
res.emplace_back(dirp->d_name);
}
}
closedir(dp);
return std::move(res);
}
int main(int argc, char* argv[]) {
// std::string input_file;
// if (argc != 2) {
// printf("Usage: %s <input_file>\n", argv[0]);
// return -1;
// } else {
// input_file = argv[1];
// }
// Unpack upk;
// if (upk.unpack(input_file) != 0) {
// printf("解包文件失败, %s, 请查看日志\n", input_file.c_str());
// return -1;
// }
// 遍历cfile文件夹下的所有压缩文件, 拿到文件名
auto v = get_cmp_files("cmp");
if (v.size() > 0) {
Decompress dcp;
chdir("cmp"); // 将工作目录变更到cmp文件夹下, 方便后续处理
for (const auto& cmp_file : v) {
printf("开始解压缩文件, %s\n", cmp_file.c_str());
dcp.decode(cmp_file);
printf("解压缩文件结束, %s\n", cmp_file.c_str());
}
} else {
printf("此次下传中不包含图像压缩文件, 略过解压步骤\n");
}
printf("处理结束, GoodBye~~\n");
return 0;
}
RT, get_cmp_files函数的return std::move(res);一执行就崩溃...不明白为啥, 只是简单的不想vector值复制而已...难道我的右值引用和移动语义有问题? 用的gcc 9.4编译的
--
FROM 106.120.11.*
你为何要返回一个rvalue?
【 在 hl0737 的大作中提到: 】
: std::vector<std::string>&& get_cmp_files(const std::string& dir) {
: std::vector<std::string> res;
: DIR* dp;
: ...................
--
FROM 125.119.96.*
没听说返回右值引用的,直接返回值就行了
【 在 hl0737 的大作中提到: 】
: std::vector<std::string>&& get_cmp_files(const std::string& dir) {
: std::vector<std::string> res;
: DIR* dp;
: ...................
--
FROM 123.112.22.*
算了,送佛送到西
关键词RVO
returning named valued or temp value directly triggers RVO
【 在 ziqin 的大作中提到: 】
: 你为何要返回一个rvalue?
:
--
FROM 125.119.96.*
额, 我想的是不要vector值复制...如果直接返回左值, vector的内容不是会复制一份么
【 在 ziqin 的大作中提到: 】
: 你为何要返回一个rvalue?
:
--
FROM 106.120.11.*
那本来函数里面已经有一份了, 然后函数返回, main函数里面又复制了一份, 我想让main函数里面的vector直接指向子函数里面创建的那份堆的空间, 相当于指针换个指向
【 在 Bernstein 的大作中提到: 】
: 没听说返回右值引用的,直接返回值就行了
:
--
FROM 106.120.11.*
不需要,不会复制
返回值优化很久以前就有了
【 在 hl0737 的大作中提到: 】
: 那本来函数里面已经有一份了, 然后函数返回, main函数里面又复制了一份, 我想让main函数里面的vector直接指向子函数里面创建的那份堆的空间, 相当于指针换个指向
--
修改:Bernstein FROM 123.112.22.*
FROM 123.112.22.*
1、返回的右值引用也好,引用也好,都是指向函数内部的栈上临时变量的,都是use-after-free的错误。
所以不能返回栈上临时变量的引用、右值引用。
2、返回栈上的临时变量时,用值返回就行,编译器会有自动的RVO优化。而且不要加std::move,加了反而会影响RVO。
std::move()是个很大的障眼法,很多人以为它会自动转移class/struct内部的数据。
如果你以为std::move会把栈上临时变量的值转移到你的main()里的那个变量v里边,这是错误的。
它只是强制把引用转为右值引用,但本质还是个引用。只有把这个右值引用传给一个移动构造、移动赋值函数时,才会发生数据转移。
【 在 hl0737 的大作中提到: 】
: 额, 我想的是不要vector值复制...如果直接返回左值, vector的内容不是会复制一份么
--
修改:z16166 FROM 123.118.191.*
FROM 123.118.191.*
呃,右值引用会延长生命周期吧
--
FROM 39.155.212.*
嗯,理解岔了
如果get_cmd() 返回右值的话
auto && xxx = get_cmd() 或者 const auto & xxx = get_cmd() 这种会延长右值的声明周期
【 在 z16166 的大作中提到: 】
: shared_ptr才可能延长指向的数据的生命周期
: c++里你给一个变量增加无数个引用、右值引用,也不会延长指向的这个变量的生命周期
:
--
FROM 39.155.212.*