You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将文件数据读取到指向结构体的动态分配链表?程序崩溃排查

Troubleshooting Segmentation Fault Caused by std::invalid_argument in stoi

Hey there, let's break down the issue you're dealing with. Your program compiles fine but crashes with a segmentation fault, and your GDB backtrace points to std::invalid_argument thrown by stoi—this is the root cause of your crash (unhandled exceptions in C++ will terminate the program, which can look like a segfault depending on how your runtime handles it).

Here's a step-by-step approach to diagnose and fix this:

1. Understand the stoi Exception

The std::invalid_argument error means you're passing a string that can't be parsed as a valid integer to stoi. Common culprits include:

  • Empty strings (from blank lines in your input file, or failed reads)
  • Strings containing non-numeric characters (letters, symbols, or even extra whitespace that you haven't trimmed)
  • Strings that start with valid numbers but have trailing garbage (e.g., "123abc")

2. Validate Input Strings Before Conversion

Before calling stoi, add debug output to see exactly what string you're trying to convert. This will immediately show you which piece of data is causing the problem:

std::string input_str = /* string read from your file */;
// Print the string with quotes to catch hidden whitespace/empty values
std::cerr << "Attempting to convert string: '" << input_str << "' to integer\n";
try {
    int value = std::stoi(input_str);
    // Proceed with using 'value'
} catch (const std::invalid_argument& e) {
    std::cerr << "ERROR: Invalid integer string: '" << input_str << "'\n";
    std::cerr << "Exception message: " << e.what() << "\n";
    // Handle the error (skip this entry, exit gracefully, etc.)
    std::exit(EXIT_FAILURE);
} catch (const std::out_of_range& e) {
    // Don't forget to handle cases where the number is too big/small for int
    std::cerr << "ERROR: Integer out of range: '" << input_str << "'\n";
    std::exit(EXIT_FAILURE);
}

3. Check Your File Reading Logic

Since you're reading from a file, make sure you're handling edge cases properly:

  • Are you checking if the file opened successfully? If not, you might be reading garbage data.
  • If using getline, are you handling leftover newline characters from previous cin calls? This can lead to reading empty strings.
  • Are you stopping when you reach the end of the file? Reading past EOF will result in invalid, empty, or garbage strings.

4. Verify Linked List & Array Conversion Logic

While the immediate crash is from stoi, it's worth double-checking your dynamic memory handling to avoid future issues:

  • When creating linked list nodes, ensure you're properly allocating Element* instances (e.g., new Element() instead of using uninitialized pointers).
  • When converting the linked list to an array, confirm the array size matches the actual length of the linked list—off-by-one errors can lead to segfaults later.
  • Make sure you're not dereferencing null pointers anywhere in the get_table function.

5. GDB Debugging Tips

To dig deeper without adding debug prints, use GDB to inspect the problematic string:

  1. Set a breakpoint at the line where stoi is called:
    break your_file.cpp:XX  # Replace XX with the line number of stoi call
    
  2. Run your program:
    run
    
  3. When the breakpoint hits, print the string you're trying to convert:
    print input_str  # Replace with your actual string variable name
    

This will show you exactly what's being passed to stoi when the exception is thrown.


内容的提问来源于stack exchange,提问作者Jeremy Canning

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:26:03