2015-07-10 10 views
-1

Я пытаюсь реализовать функцию c_str() моего собственного класса String. Это похоже на работу, но по какой-то причине он печатает «=» в конце каждой строки:c_str() пользовательская реализация/"=" в конце каждой строки

const char* c_str() 
    {  
     char* temp = alloc.allocate(data.size() + 1); 
     uninitialized_copy(data.begin(), data.end(), temp); 
     temp[data.size()+1] = '\0'; 
     return temp; 
    } 

Частной части класса Str:

private: 
    Vec<char> data; 
    allocator<char> alloc; 

* Vec является в основном вектором.

int main() 
{ 
    Str s1 = "Hello, beee"; 
    cout << s1.c_str(); 
    return 0; 
} 

Где я ошибаюсь?

ответ

2

Проблема здесь:

temp[data.size() + 1] = '\0'; 

char массив выделяется для data.size() + 1 байт, так что индексы должны быть от 0 к data.size(). temp[data.size() + 1] только что вышел из границы массива. Этот код также может привести к неопределенному поведению.

Это должно быть

temp[data.size()] = '\0'; 
+0

Правильно, я этого не замечал. Спасибо – trollpidor

+1

Это не значит, что он * может * привести к неопределенному поведению. Это * * приводит к неопределенному поведению. Сегодня для Trollpidor неопределенное поведение проявляется довольно мягко, как знаки равенства на концах всех строк. Завтра он может проявиться как носовые демоны. Вот что значит быть неопределенным. –

1

Вы используете позицию на границе массива. Индекс массива подсчитывается от 0, поэтому индекс последнего элемента должен быть sizeof(array) - 1.

temp[data.size()+1] = '\0'; должен быть temp[data.size()] = '\0';

+0

Спасибо! Я этого не заметил. – trollpidor

Смежные вопросы