C++ 为什么我的程序会引发异常

C++ Why is my program throwing an exception?

本文关键字:异常 程序 为什么 我的 C++      更新时间:2023-10-16

我是编程新手,我正在尝试编写一个从列表中获取最短字符串的函数,但每次我运行它时,Visual Studio 都会显示错误"引发异常:读取访问冲突"。错误在哪里?

#include <iostream>
#include <string>
using namespace std;
const string &shortest_string(initializer_list<string> strings) {
    string *shortest_one = nullptr;
    for (string string : strings) {
        if (shortest_one == nullptr) shortest_one = &string;
        else {
            if (string.size() < shortest_one->size()) shortest_one = &string;
        }
    }
    return *shortest_one;
}
int main() {
    cout << shortest_string({ "hello" , "my", "name", "is", "dan" }) << endl;
    return 0;
}
if (shortest_one = nullptr)不是

比较操作。这是一项作业,将shortest_one设置为nullptr.此操作的计算结果为 0,因此if表达式等效于 if (0)if (false)

然后在else块中,您正在使用shortest_one->size()shortest_one为空...

尝试改用if (shortest_one == nullptr)

你用与类型名称匹配的名称(字符串变量,字符串类型?)创建了变量。另外,还有一个问题,即返回指向具有本地生活范围的对象的指针。那就是UB。使用迭代器,您的函数将像这样工作:

const string shortest_string(initializer_list<string> strings) {
    if(!strings.size()) return string();
    auto shortest_one = strings.begin();
    for (auto it = shortest_one+1; it < strings.end(); it++   ) 
    {
        shortest_one = (it->size()< shortest_one->size()) ? it : shortest_one;
    }
    return *shortest_one;
}