Тут размещают свои топики новички в С/С++.

Тема в разделе "LANGS.C", создана пользователем nitrotoluol, 4 мар 2007.

  1. reversecode

    reversecode Guest

    Публикаций:
    0
    скалярный деструктор
    http://www.hexblog.com/wp-content/uploads/2011/08/Recon-2011-Skochinsky.pdf
    http://www.blackhat.com/presentations/bh-dc-07/Sabanal_Yason/Paper/bh-dc-07-Sabanal_Yason-WP.pdf

    работает нормально
     
  2. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Treant
    Этот стаб образуется из-за того, что деструктор объявлен виртуальным. В двух словах для чего это нужно:
    Код (Text):
    1. class A {
    2.  public:
    3.   virtual ~A() {}
    4. };
    5.  
    6. class B : public A {
    7.  public:
    8.   virtual ~B() {}
    9. };
    10.  
    11. A* p = new B();
    12. delete p; // это вызовет сначала деструктор класса B, затем деструктор класса A. Подробнее - в гугле.
     
  3. tid

    tid Member

    Публикаций:
    0
    Регистрация:
    2 дек 2010
    Сообщения:
    57
    Учебная задача: написать класс strtype, перегрузить для него операторы =, +, ==, <, >.
    Прокомментируйте пожалуйста, особенно интересует моё решение того, как я перегрузил оператор сложения. Было бы лучше решить эту задачу перегрузкой консртуктора копий?

    Код (Text):
    1. #include <iostream>
    2. #include <cstdlib>
    3. #include <cstring>
    4. using namespace std;
    5.  
    6. class strtype {
    7.     char *p;
    8.     int length;
    9. public:
    10.     strtype() {
    11.         p = new char;
    12.         *p = '\0';
    13.         length = 0;
    14.     }
    15.     strtype(char *str) {
    16.         length = strlen(str);
    17.         p = new char [length+1];
    18.         if (!p) {
    19.             cout << "memory error\n";
    20.             exit(1);
    21.         }
    22.         strcpy(p, str);
    23.     }
    24.     ~strtype() { delete [] p; };
    25.     strtype &operator+(strtype &ob); //+
    26.     strtype &operator=(strtype &ob); //+
    27.     strtype &operator=(char *str);   //+
    28.     int operator==(strtype &ob);     //+
    29.     int operator>(strtype &ob);      //+
    30.     int operator<(strtype &ob);      //+
    31.     void show() { cout << "str: " << p << "\nlength: " << length << "\n"; }
    32. };
    33.  
    34. strtype &strtype::operator+(strtype &ob)
    35. {
    36.     strtype *temp;
    37.     temp = new strtype;
    38.     int len = this->length + ob.length;
    39.     temp->length = len;
    40.     temp->p = new char [len+1];
    41.     if (!temp->p) {
    42.         cout << "memory error\n";
    43.         exit(1);
    44.     }
    45.     strcpy(temp->p, this->p);
    46.     strcat(temp->p, ob.p);
    47.     return *temp;
    48. }
    49.  
    50. strtype &strtype::operator=(strtype &ob)
    51. {
    52.     delete [] this->p;
    53.     this->length = ob.length;
    54.     this->p = new char [ob.length + 1];
    55.     if (!this->p) {
    56.         cout << "memory error\n";
    57.         exit(1);   
    58.     }
    59.     strcpy(this->p, ob.p);
    60.     return *this;
    61. }
    62.  
    63. strtype &strtype::operator=(char *str)
    64. {
    65.     delete [] p;
    66.     this->length = strlen(str);
    67.     this->p = new char [this->length + 1];
    68.     if (!this->p) {
    69.         cout << "memory error\n";
    70.         exit(1);   
    71.     }
    72.     strcpy(this->p, str);
    73.     return *this;
    74. }
    75.  
    76. int strtype::operator==(strtype &ob)
    77. {
    78.     return !strcmp(this->p, ob.p);
    79. }
    80.  
    81. int strtype::operator>(strtype &ob)
    82. {
    83.     return strcmp(this->p, ob.p);
    84. }
    85.  
    86. int strtype::operator<(strtype &ob)
    87. {
    88.     return strcmp(this->p, ob.p);
    89. }
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    В принципе нормально, только у ссылок на принимаемые объекты нужно поставить модификатор const. И в операторе приcваивания нужно в первую очередь проверить объект с this, иначе у вас будет нехорошая ситуация. ^)

    Да и ещё не делайте в операторе присваивания так - "temp = new strtype;" из-за этого вы рискуете приобрести утечку. Сделайте конструктор копирования и возвращайте автоматический объект.
     
  5. tid

    tid Member

    Публикаций:
    0
    Регистрация:
    2 дек 2010
    Сообщения:
    57
    Booster
    Спасибо!
     
  6. Rorschach

    Rorschach New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2011
    Сообщения:
    1
    Доброго всем времени суток. Каким образом можно узнать была ли освобождена динамически выделенная память?
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    http://msdn.microsoft.com/en-US/library/e5ewb1h3%28v=VS.80%29.aspx, но с new это не работает. Можно определить макрос new.
    Но гораздо ,более удобная штука - VLD, он теперь вроде и с VS 2010 дружит, рекомендую. Пользовался им в VS2005, утечки на раз находит. Ну а в линукс понятно - valgrind.
     
  8. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
  9. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    Добрый вечер.

    Открыл книгу по QT и на первом же примере:

    Код (Text):
    1. #include <QApplication>
    2. #include <QLabel>
    3.  
    4. int main(int argc, char *argv[])
    5. {
    6.     QApplication app(argc, argv);
    7.     QLabel *label = new QLabel("Hello, QT");
    8.     label->show();
    9.     return app.exec();
    10. }
    возник вопрос:
    Код (Text):
    1. QLabel *label = new QLabel("Hello, QT");
    Зачем здесь указатель?
    Почему не написали
    Код (Text):
    1. QLabel label("Hello, QT");
    ?
     
  10. ec38ca7f46fd47a7

    ec38ca7f46fd47a7 New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2011
    Сообщения:
    19
    ну может когда он ловит WM_CLOSE сам вызывает delete для формы и
    дочерних контролов если нет то это говнокод с утечкой
     
  11. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    Может и вызывает, но я не пойму, чем они руководствувались, когда создавали указатель на обьект.
     
  12. ec38ca7f46fd47a7

    ec38ca7f46fd47a7 New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2011
    Сообщения:
    19
    поставьте точку останова на доступ к данным по адресу выделенной
    памяти в дебаге куча при освоброждении мемсетится aka memset
    специальными байтами потом посмотрите стек вызовов кто
    освобождает эту память
     
  13. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    bug1z
    Перефразировав Вашу фразу, получится "Может и поэтому, но я не пойму почему."
    Помимо этого есть ещё куча всяких причин, как то - время жизни объекта. Погуглите.
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    bug1z
    В данном случае разница не принципиальна, объект и так и так уничтожится при выходе из main.
    http://doc.qt.nokia.com/latest/qlabel.html - один из конструкторов принимает parent, при его уничтожении его children грохнуться автоматом.
     
  15. tid

    tid Member

    Публикаций:
    0
    Регистрация:
    2 дек 2010
    Сообщения:
    57
    Приветствую!
    Возник вопрос:

    написал прогу в VC++ 2010, ос Win 7. когда скомпилиную прогу запускаю в WinXP, появляется ошибка MSVCP100.dll не найдена. Вопрос, как собрать прогу в VC++2010, что бы она запускалась под XP тоже.
     
  16. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    кинь в системную директорию этот файл обнови редист 2008с++
     
  17. tid

    tid Member

    Публикаций:
    0
    Регистрация:
    2 дек 2010
    Сообщения:
    57
    это понятно, вопрос в том как скомпилить в VC++ 2010 прогу так что бы она работала везде.
    скачать dll хорошо, только скажем когда я в универ приду и буду запускать прогу на произвольной машине каждый раз качать dll не вариант, да и доступа к windir может не быть.
     
  18. tid

    tid Member

    Публикаций:
    0
    Регистрация:
    2 дек 2010
    Сообщения:
    57
    проблему решил так:

    в настройках солюшена, в C\C++ Code Generation Runtime Library указал /MT вместо /MD.
     
  19. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    /MT

    upd: опередили.
     
  20. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    А МТ что значит. Линковать библиотеку к exe или что