2015-06-16 3 views
0
#include<iostream> 
    #include<stdio.h> 
    #include<string.h> 

    class String{ 

    public: 
      String(){} 
      String(const char *ptr) 
      { 
        pstr_= new char[strlen(ptr) + 1]; 
        strcpy(pstr_,ptr); 
      } 
      String(const String &str) 
      { 
        strcpy(this->pstr_,str.get_pstr()); 
      } 

      ~String() 
      { 
        delete pstr_ ; 
      } 

      char *get_pstr() 
      { 
        return pstr_ ; 
      } 
    private: 
      char *pstr_ ; 

    }; 

    int main(int argc,char *argv[]) 
    { 
      char *sh = "Hello World"; 
      String str(sh) ; 
      String st(str) ; 
      std::cout << str.get_pstr() << std::endl ; 

      return 0 ; 
    } 

Извините, мой английский плохой и поможет вам понять мой смысл. Я пишу код вроде этого. Я уверен, что это правильно. Однако это может привести к сбою сегрегации. Итак, я нахожу странное явление gdb.Как понять функцию copy-constructior?

38    std::cout << str.get_pstr() << std::endl ; 
(gdb) n 

Breakpoint 1, String::get_pstr (this=0x7fffffffe470) at String.cpp:26 
26      return pstr_ ; 
(gdb) n 
27    } 
(gdb) n 
Hello World 
main (argc=1, argv=0x7fffffffe578) at String.cpp:40 
40    return 0 ; 
(gdb) n 
37    String st(str) ; 
(gdb) n 

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff7282ba1 in __strlen_sse2() from /lib64/libc.so.6 

Когда программа работает, чтобы вернуть 0, она может перезапустить String st (str). И я беспокоюсь об этом. Помогите вам это объяснить. Спасибо!

ответ

0

Итак, здесь есть две проблемы.

Ошибка связана с тем, что вы не выделяете новую память в конструкторе копирования. Сравните это с обычным конструктором, где вы правильно это сделаете, прежде чем копировать строку.

Вторая проблема заключается в том, что gdb ведет себя в этом случае запутанным образом. Вероятно, вы скомпилировали свой код с некоторым уровнем оптимизации, чтобы компилятор мог изменить порядок инструкций. Поскольку копированная строка не нужна во время печати cout, по какой-то причине она прошла мимо нее, и это то, что показывает gdb. . Попробуйте перекомпилировать код без оптимизации, и вы должны увидеть инструкции выполняются в порядке их написали в

+0

Как вы сказали, я так неосторожен, что забыл написать выделение памяти. Спасибо за ваш ответ. Может быть, мне нужно более осторожно. –

+0

Добро пожаловать. Я вижу, что вы новичок в Stackoverflow: не забывайте поднимать и принимать любые полезные ответы на ваши вопросы! Посмотрите [на туре сайта] (http://stackoverflow.com/tour). Ура! – UncleZeiv

0

Вы должны выделить память в конструкторе копирования также:

String(const String &str) 
{ 
    pstr_= new char[strlen(ptr.get_pstr()) + 1]; 
    strcpy(this->pstr_,str.get_pstr()); 
} 

или:

String(const String &str): String(str.get_pstr()) { } 
+0

Спасибо. Я могу извинить свой код по вашему методу. Я чувствую, что я должен узнать больше о konwledget.You хороший человек. –

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