C++ 为什么我的程序会引发异常
C++ Why is my program throwing an exception?
我是编程新手,我正在尝试编写一个从列表中获取最短字符串的函数,但每次我运行它时,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;
}
相关文章:
- 为什么异常不退出程序?
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 在C++程序中使用的迭代器中未处理的异常
- 与异常处理程序中的操作员<<不匹配
- 捕获异常后如何退出程序执行
- 捕获全部处理程序检测C++中的子类异常
- 数组 C++ 上的异常处理程序
- SDL_Image库会使程序崩溃或使其行为异常
- 从终止处理程序访问所有未捕获的异常
- 引发未经处理的异常:简单 C++ 程序中的读取访问冲突,动态增加数组长度以存储数字
- 使用 C++ dll 运行 c# 应用程序会生成无法加载异常
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- 奇怪的消息 (_Base_bitset::_M_do_to_ulong) 从溢出异常处理程序中打印出来
- 从处理程序捕获时如何获取 Ada 异常消息C++?
- 核心消息传递中未处理的异常.dll在程序关闭期间
- C++ 未捕获异常,程序将终止并中止
- C++程序在第一次尝试时会给出垃圾,但如果它捕获异常并重试,则会给出适当的值
- 如何处理异步函数中的异常UWP应用程序getFileFrompathAsync(path);
- 未处理异常- c++程序在强制转换时停止