簡體   English   中英

使用gcc編譯代碼后,不會輸出std :: out_of_range異常字符串

[英]std::out_of_range exception string won't print after compiling code with gcc

我正在嘗試測試以下異常處理代碼:

#include "Array_Template.h"
using namespace std;

int main()
{
    Array<int> intArr1;
    //attempt to use out-of-range subscript
    try{
        cout << "\nAttempt to assign 1000 to intArr1[6]" << endl;
        intArr1[6] = 1000;
    } //end try
    catch (const out_of_range &ex){
        cout << "An exception occurred: " << ex.what() << endl;
    } //end catch
    return 0;
} //end main

在我的Array類模板中:

#ifndef ARRAY_H
#define ARRAY_H

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <stdexcept>

//forward declarations of friend functions as specializations of template
template<typename T> class Array;

template<typename T>
std::istream &operator>>(std::istream &, Array<T> &);
template<typename T>
std::ostream &operator<<(std::ostream &, const Array<T> &);

//Array class template
template<typename T>
class Array
{
    friend std::istream &operator>> <>(std::istream &, Array<T> &);
    friend std::ostream &operator<< <>(std::ostream &, const Array<T> &);
public:
    Array(int = 5); //default constructor of array size 5
    Array(const Array<T> &); //copy constructor
    ~Array(); //destructor
    int getSize() const; //return size of array
    const Array<T> &operator=(const Array<T> &); //overloaded assignment operator
    bool operator==(const Array<T> &) const; //overloaded equality operator
    bool operator!=(const Array<T> &r) const //overloaded inequality operator, inline definition
    {
        return !(*this == r); //invokes Array<T>::operator==
    }
    T &operator[](int); //overloaded subscript operator for non-const objects
    T operator[](int) const; //overloaded subscript for const objects
private:
    int size; //pointer-based array size
    T *arrPtr; //pointer to first element of array
}; //end class Array

template<typename T>
Array<T>::Array(int s)
    :size(s > 0 ? s : 5), arrPtr(new T[size])
{
    for (int i = 0; i < size; ++i)
        arrPtr[i] = 0;
} //end Array constructor

template<typename T>
//ref return creates a modifiable lvalue
T& Array<T>::operator[](int index)
{
    if (index < 0 || index >= size) //check if out of bounds
        throw std::out_of_range::out_of_range("index out of range");
    return arrPtr[index]; //ref return
} //end operator[]

template<typename T>
//const ref return creates an rvalue
T Array<T>::operator[](int index) const
{
    if (index < 0 || index >= size) //check if out of bounds
        throw std::out_of_range::out_of_range("index out of range");
    return arrPtr[index]; //returns copy of this element
} //end operator[]

#endif

該程序在Visual Studio中編譯並執行良好,顯示正確的單行錯誤消息: 超出范圍錯誤消息

但是,當我用gcc編譯相同的程序並運行它時,我得到以下輸出:

*`./arrays_template'中的錯誤:free():無效大小:0x0000000001426030 * =======回溯:======== /lib64/libc.so.6(+0x7364f)[0x7fd7c2e3d64f ] /lib64/libc.so.6(+0x78eae)[0x7fd7c2e42eae] /lib64/libc.so.6(+0x79b87)[0x7fd7c2e43b87] ./arrays_template[0x4011a1] ./arrays_template[0x400fc7] / lib64。 6(__ libc_start_main + 0xf5)[0x7fd7c2debbe5] ./arrays_template[0x400c29]

然后是一個較長的內存映射跟蹤。 有人可以解釋這里到底發生了什么以及如何解決? 通過修復,我的意思是我如何才能獲得與catch塊中指定的相同的錯誤消息進行打印。

下面的代碼是錯誤的:

throw std::out_of_range::out_of_range("index out of range");
//       ^^^^^^^^^^^^^^

應該將其重寫為:

throw std::out_of_range("index out of range");

調用std::out_of_range構造函數


另外,請確保修改operator[](int) const的返回類型。

在兩個運算符中從

throw std::out_of_range::out_of_range("index out of range");

throw std::out_of_range("index out of range");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM