2012-03-09 2 views
0

Можно создать дубликат:
What is The Rule of Three?Оценка и прохождение классов по стоимости?

Следующий код выводит мусор в лучшем случае или аварии:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

class C { 
public: 
    char* s; 
    C(char* s_) { 
     s=(char *)calloc(strlen(s_)+1,1); 
     strcpy(s,s_); 
    }; 
    ~C() { 
     free(s); 
    }; 
}; 

void func(C c) {}; 

void main() { 
    C o="hello"; 
    printf("hello: %s\n",o.s); // works ok 
    func(o); 
    printf("hello: %s\n",o.s); // outputs garbage 
}; 

Мне очень интересно, почему - объект не должен даже прикасаться, потому что Im передают его по значению ...

+4

Также, *** ПОЖАЛУЙСТА ***, воздержитесь от кодирования «C с классами» ... ПОЖАЛУЙСТА! – Xeo

+0

@Xeo Почему он не должен? –

+0

@James: Потому что это все, что плохо в этом мире (C++). – Xeo

ответ

3

все о вашем коде плохо в глазах C++, извините. попробовать этот

#include <iostream> 

class C { 
    std::string s; 
    C(const std::string& s_) 
    : s(s_){} 
}; 

std::ostream& operator<<(std::ostream& os, const C& c){ 
    return os << c.s; 
} 

void func(C& c){ 
    // do what you need here 
} 

int main(){ 
    C c("hello"); 
    std::cout << c << '\n'; 
    func(c); 
    std::cout << c << std::endl; 
    return 0; 
} 

В этом примере вам не придется беспокоиться о распределении памяти и разрушении, строках формата Printf или зЬгсре. Он гораздо более надежный.

C с классами (это то, что вы пишете) категорически ошибочно и слепо игнорирует функции, которые были созданы, чтобы сделать язык более безопасным и легким без накладных расходов.

+0

Я согласен, что это правильный путь, но я до сих пор задаюсь вопросом, почему исходный код падает. вероятно, double free() – Nick

+0

Я знаю, что это старый ... но, думая о сбое, возможно, что экземпляр нового класса «С», созданный после операции копирования при вызове функции «func (o)», вызовет «free (..)« on », который не был инициализирован. Автоматическое время жизни вызовет деструктор, когда «func» выйдет, что вызывает свободный от неинициализированных 's'. Может быть. –

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