调试器无法显示 C++ 中采用向量的函数的返回值

问题描述 投票:0回答:1

我有这个 C++ 程序,当我运行调试器时,它无法显示

f1
的返回值。

screenshot

#include <iostream>
#include <vector>
#include <string>

using namespace std;

string f1(vector<int> v) {
    return "this takes in a vector\n";
}

string f2(int x[]) {
    return "this takes in an array\n";
}

int main() {
    vector<int> vec = {1, 2, 3};
    string x = f1(vec);
    cout << x;

    int arr[] = {1, 2, 3};
    string y = f2(arr);
    cout << y;
}

当我运行程序时,

f1
f2
都按预期执行,并且我看到了正确的输出。

但是,当我调试程序时:
调试器评估

f2(arr)
的返回值。
调试器无法显示
f1(vec)
的返回值。

c++ visual-studio-code debugging gcc gdb
1个回答
0
投票

直接将函数设置为监视变量可能不是您想要的行为。在大多数情况下,将监视变量设置为存储返回值的字符串(在本例中为

x
y
字符串)将是您想要的。

这确实是简短的答案。长答案涉及了解 C++ 编译器。

至于为什么它们在监视窗口中显示不同,这很可能是因为函数的编译方式不同:

  • 在接受基本数组的情况下,编译器可以识别出该函数只做一件事,返回静态字符串,并且可以优化其他所有内容,以便调试器输出仅显示该字符串。
  • 在接受向量的情况下,事情就没那么简单了。当类作为参数传递时,会在幕后发生一些额外的事情。其中之一是复制构造函数被调用,这意味着如果复制构造函数被重写,则可以执行任意数量的任意代码。显然,这个例子中没有发生这种情况,但编译器无法确定这一点,因此无法进行与第一种情况相同的优化。
© www.soinside.com 2019 - 2024. All rights reserved.