2015-08-10 4 views
-1

Привет, я строю проект, и сегодня после 500 строк кода я собираюсь застрелить себя. Сегодня я начал новый класс и некоторые очень странные вещи происходят:const char * const изменяется из-за строки (?)

class Target { 
public: 
Target(const int port); 
virtual ~Target(); 

private: 
    const char* initialize_port(const int port) const; 
    const char *const port; 
}; 

и CPP файл:

Target::Target(const int port) 
: 
port(initialize_port(port)) 

{ 
    cout<<this->port<<endl; //this cout 80 
    string test3="Target2";//when i replace with char * test3="Target2" then both couts in the constructor are working ok. 
    cout<<this->port<<endl; //this cout Target2!!!!!! 
} 


const char* Target::initialize_port(const int port) const { 

    string port_str = std::to_string(port); 
    const char* port_char=port_str.c_str(); 
    return port_char; // OR/and when i replace with something like return "80" then both couts in the constructor are working ok. 

} 


Target::~Target() { 
} 

Как вы можете увидеть в файле CPP, а конструктор по умолчанию вызывается его couts «this-> port», затем я создаю строку, а затем снова печатаю ее. Как можно получить другой ответ?

От NetBeans:

Target2

RUN FINISHED; значение выхода 0; в реальном времени: 20 мс; user: 0ms; Система: 0ms


PS: Когда в функции initialize_port (Const ИНТ порта) я даю стандартный возврат, например, возвращение "80"; все в порядке. Когда в конструкторе я заменяю строку char *, снова все в порядке.

PS2: Я знаю, что у меня есть проблемы с моей оперативной памятью. Если кто-то будет компилироваться, и нет проблем с выходами (cout), пожалуйста, дайте мне знать.

Заранее благодарен.

+4

Если вы хотите сохранить строку, используйте 'string'. У вас есть висячий указатель и неопределенное поведение. –

+0

Ничего важного для диагностики какого-либо конкретного вопроса здесь не было, извините! –

+0

Я искренне надеюсь, что «и сегодня после 500 строк кода я собираюсь снимать себя» - это просто неправильный перевод? – villintehaspam

ответ

2

Проблема возникает из:

{ 
    string port_str = std::to_string(port); 
    const char* port_char=port_str.c_str(); 
    return port_char; 
} 

return Когда происходит, port_str разрушается, потому что это переменная локаль этого блока кода. Тогда port_char - это оборванный указатель (указатель, который указывал на объект, который теперь был уничтожен).

Использование этого указателя вызывает неопределенное поведение и объясняет ваши странные эффекты при использовании указателя.

Чтобы исправить это, прекратите использование необработанных указателей. Самое простое исправить - вместо этого использовать std::string.

+0

Спасибо вам большое. –

0

Проблема в том, что возвращаемое значение port_str.c_string() действителен только для жизни port_str. Так как это выделено в стеке в initialize_port, он становится недействительным после возвращения этой функции.

В вашем конструкторе, когда вы инициализируете строку test3, она заканчивается (в основном случайно), занимая ту же память, что и port_str.

Если вам нужно использовать const char *, вам нужно будет выделить новую память для строки внутри initialize_port (и освободить ее в своем конструкторе!). В качестве альтернативы просто используйте файлы std: string.

+0

Я вижу! Большое спасибо! –

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