【问题标题】:C++ Why is my program throwing an exception?C++ 为什么我的程序会抛出异常?
【发布时间】:2017-01-01 20:13:48
【问题描述】:

我是编程新手,我正在尝试编写一个从列表中获取最短字符串的函数,但每次运行它时,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;
}

【问题讨论】:

  • 因为string string : ... 创建了一个临时变量,该变量在一个循环周期中存在并在下一个周期被销毁。你正在获取它的指针(指向释放的内存)
  • if (shortest_one = nullptr) - 你觉得这有什么作用?
  • 既然您已经问了第二个不同的问题,我们什么时候才能看到展示行为的真实代码?

标签: c++ string function pointers initializer-list


【解决方案1】:

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

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

尝试改用if (shortest_one == nullptr)

【讨论】:

  • @Pinwar78:不要责怪回答者。通过提供真实的代码来提出一个真实的问题,并解释哪一行产生了访问冲突。调用堆栈也会有所帮助。
【解决方案2】:

您创建了名称与类型名称匹配的变量(字符串变量,字符串类型?)。另外还有一个问题是您返回指向具有本地生命范围的对象的指针。那就是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;
}

【讨论】:

  • it &lt; strings.end() 是一个错误。那应该是it != strings.end()shortest_one+1 是空初始化列表的未定义行为。
  • @IInspectable 哦,如果是空列表,我同意,整个函数应该短路返回空,是的。如果给定非法数据或生成错误,或者返回空结果,函数是否应该崩溃是架构师的问题。 it &lt; strings.end()it != strings.end() 对于随机访问迭代器都是合法的,在这种情况下它不是错误。从技术上讲,你不能超越终点,是的。如果循环必须在 end() 之前结束怎么办?使用链表迭代器你不能这样做,但使用通常的列表、向量等你可以
  • it &lt; strings.end()it != strings.end() 对于随机访问迭代器都是合法的” - 祝您下次使用 std::deque 时使用该“规则”时好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多