Передача по ссылке и nullptr

211
10 апреля 2017, 07:23

Пишу функцию на с++ типа:

solve(vector<vector<int>> &matrix);

Вроде ничего сложного, просто передается аргумент по ссылке. Как я понял, с точки зрения ассемблера это просто адрес matrix положенный на стек. Решил протестировать ее, и на одном сайте на стек кладут nullptr и программа аварийно завершается.

Первый вопрос: можно ли на своем ПК встретить такую же ситуацию, когда при передаче аргумента по ссылке на стек кладется nullptr?

Второй вопрос: как же все-таки отловить такую ошибку, так как любое обращение к matrix сразу ведет к разыменование нулевого указателя и аварийному завершению?

Answer 1

В С++ ссылка не может содержать nullptr. Отсюда следует, что проверять на наличие nullptr смысла нет.

Answer 2

Ну, если вы думаете, что кому-то не лень издеваться над кодом вот так:

#include <iostream>
#include <iomanip>
using namespace std;
void f(int&i)
{
    cout << i << endl;
}
int main(int argc, const char * argv[])
{
    int& i = *static_cast<int*>(nullptr);
    f(i);
}

то можно на всякий случай вставить проверку:

void f(int&i)
{
    if (&i == nullptr) 
    { 
        cout << "Не надуришь!\n";
    }
    else
    {
        cout << i << endl;
    }
}
READ ALSO
С++ Регулярные выражения. Рекурсия?

С++ Регулярные выражения. Рекурсия?

Здравствуйте, имею задачу получить список содержимого между пар (

312
Расширение QTableView по контенту

Расширение QTableView по контенту

Есть QTableView, нужно чтобы ее размеры подгонялись по размеру содержимогоНо не флаг Stretch в хедерах

215
Присвоение итераторов

Присвоение итераторов

Предположим, у меня есть std::vector<int> vec1 размера nТакже есть RandomAccessIterator begin и end, которые принадлежат другому вектору vec2 такого же размера

251