calloc структуры с объектом string

Тема в разделе "LANGS.C", создана пользователем mitsrc, 21 окт 2010.

  1. mitsrc

    mitsrc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2010
    Сообщения:
    2
    Добрый день.

    Есть код:
    Код (Text):
    1. typedef struct{
    2.    std::string obj1; // stl-ный string
    3.    int m;
    4. } TMYSTR;
    5.  
    6. int main(int argc, char* argv[])
    7. {
    8.     TMYSTR *pp=(TMYSTR*)calloc(sizeof(TMYSTR),1);
    9.     pp->obj1="hello";
    10.     free(pp);
    11. }
    VC6
    Такой код отлично работает, хотя выделение по правилам нужно делать с помощью new.
    Поясните пожалуйста, как происходит выделение памяти под объект string в данном случае? В момент calloc память еще не выделяется, а в момент присваивания строки hello выделяется памяти и происходит копирование. Это выполняется с помощью конструктора копии?
    Заранее благодарен за ответы.
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    typedef struct{
    std::string obj1; // stl-ный string
    int m;
    } TMYSTR;

    Фейспалм. Почему структура в стиле си, а внутренности - си++?


    То, что он работает - это всего лишь случайность. В общем случае это работать не должно.
     
  3. mitsrc

    mitsrc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2010
    Сообщения:
    2
    Вот потому и вызывает удивление, что работать не должен, однако - работает. Интересны internals такого поведения. Видимо создается временный объект string, а после успешно присваивается.
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Работает потому-что calloc инициализирует память нулём и потому-что так легла карта, не факт что объект должен инициализироваться нулями.

    Память под объект выделяется, все внутренние структуры объекта установлены в достаточно безопасное значение - ноль.
     
  5. Mentor

    Mentor New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2010
    Сообщения:
    67
    место в котором должно бы падать - конструктор копии std::string
    (pp->obj1="hello";)

    Почему не падает - х.з. - наверное можно увидеть в исходниках std. Может быть не обращается к внутренним данным, или обращается, но данные NULL (после calloc) и ничего плохого с ними не происходит. В подобных случая говорят что поведение не определено, то есть может произойти ВСЕ ЧТО УГОДНО. В том числе что-нибудь хорошее ожидаемое и полезное
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Mentor
    Это не конструктор копий, а оператор присваивания. У стринга есть статический буфер небольшого размера, а если бы и не было, то все структуры установлены в ноль, упасть скорее не должно, чем должно.
     
  7. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    mitsrc
    это еще можете подебажить
    выделяется память в куче вызывается для нее конструктор
    потом через функцию выводится тип и освобождается память
    Код (Text):
    1. #define ctor(t) \
    2.     (new(HeapAlloc(GetProcessHeap(), 0, sizeof((t))))t)  
    3. template<class T>
    4. inline void dtor(T *h){
    5.     if (h)
    6.         HeapFree(GetProcessHeap(), 0, (h->~T(),h));
    7. }
    8.  
    9. int main(){
    10.     int *p = ctor(int(0xdeadc0de));
    11.     dtor(p);
    12.     std::string *s = ctor(std::string("content"));
    13.     dtor(s);
    14. }
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Выделять память через calloc скорее всего безопасно, поскольку в "нормальных"=неэкзотических реализациях std::string конструктор по умолчанию наверняка просто зануляет структуру string, и calloc делает то же самое. А вот простой вызов free без явного вызова деструктора string будет приводить к утечке памяти (даже для коротких строк, т.к. далеко не все реализации хранят короткие строки в самой string)
     
  9. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    Всех приветствую.
    упоминание про расположение коротких строк в стеке у Страуструпа
     
  10. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    сплошные гадания и имена. прям как на форуме вб. что стоит скомпилить этот кусочек с дебуг инфой и посмотреть как оно в дебуге/дизасме. все вопросы сами собой отпадут.