2016-02-11 3 views
-2

Я пытался понять функторы. У меня есть следующая программа, которую я заимствовал и изменил с functors and their uses.Оператор утверждения C++, вызывающий segfault

#include <iostream>                                                       
#include <vector> 
#include <assert.h> 
#include <algorithm> 

/* 
* A functor is pretty much just a class which defines the operator(). 
* That lets you create objects which "look like" a function 
**/ 
struct add_x 
{ 
    add_x(int y) : x(y) 
    { 

    } 
    int operator()(int y) const { 
     return x + y; 
    } 

private: 
    int x; 
}; 

int main() 
{ 
    /* create an instance of the functor class*/ 
    add_x add42(42); 
    /* and "call" it */ 
    int i = add42(8); 
    /*and it added 42 to its argument*/ 
    assert(i == 50); 

    /*assume this contains a bunch of values*/ 
    std::vector<int> in; 
    std::vector<int> out(in.size()); 
    /* 
    * Pass a functor to std::transform, which calls the functor on every element 
    * in the input sequence, and stores the result to the output sequence 
    */ 
    std::transform(in.begin(), in.end(), out.begin(), add_x(1)); 
    /*for all i*/ 
    assert(out[i] == (in[i] + 1)); 
    return 0; 
} 

Я получаю ошибку сегментации во втором утверждении assert в main(). (assert(out[i] == (in[i] + 1));) Кажется, я не понимаю, почему?

+3

'INT I = add42 (8)', а затем вы используете 'i' позже индексировать в пустой 'VECTOR'. Ошибки, подобные этим, должны быть тривиальными, если вы запустите под отладчиком. – Praetorian

+0

Просьба представить [минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). –

+3

'/ * Предположим, что это содержит кучу значений * /' no, I will * not *. Вам нужно предоставить фактический код для нас, чтобы понять, почему он ломается. Очевидно, что вышеприведенный код ломается, он обращается к 50-му элементу пустого массива. Ваш код? Есть некоторые проблемы, которые мы не можем диагностировать. Не просто отправляйте весь свой код, а воспроизводите фактический пример, который остается простым, но вы получаете свою проблему (скажем, на самом деле заполняют векторы? С фиксированными значениями?). Затем проверьте, что ваша проблема возникает в вашем простом случае. – Yakk

ответ

4

in.size() вернет 0, потому что вы еще ничего не добавили. Это означает, что out инициализируется как пустой вектор.

out[i] попытается получить доступ к 51-му элементу вектора (поскольку индексы STL основаны на нулевом значении), который не существует, следовательно, segfault.

Комментарий /*assume this contains a bunch of values*/ не помогает, потому что ваш код не показывает, что in содержит что угодно.

Используйте перегружать vector(size_t n, const value_type& val) конструктора, чтобы обеспечить начальные значения для вектора, чтобы исправить эту ошибку:

using namespace std; 

... 

vector<int> in(51, 0); // initializes the vector with 51 values of zero 
vector<int> out(in.size()); // 51 
... 

assert(out[i] == int[i] + 1); 
Смежные вопросы