2015-01-22 2 views
0

У меня есть класс под названием message. Здесь вы можете найти соответствующий фрагмент кода:Socket read() ing в функцию, которая возвращает указатель в C++

class message 
{ 
    private: 
     HeaderType header; 
     // Message text 
     byte * text;  

    public: 
     ~message(); 
     byte * getText(); 
...}; 

/* 
* Destructor 
*/ 
message::~message(){ 
    if (header.ack == false) free (text); 
} 

/* 
* getText 
* 
* Returns pointer to text 
*/ 
byte * message::getText(){ 
    return text; 
} 

Мне нужно прочитать прямо в text. Итак, я создал указанную выше функцию message::getText(), которая возвращает указатель на текст. Затем я прочитал эту функцию. Я знаю, это неправильно. Кто-нибудь, пожалуйста, скажите мне, почему?

read(receive_socket,m.getText(), header.dataSize); 
+0

Почему вы знаете, что это неправильно? текст является указателем байта, и функция 'getText()' возвращает его. Указывает ли он на местоположение в памяти во время вызова, которое пока не видно, поскольку вы не показывали нам, когда и где вы назначаете 'text' –

ответ

1

Кто несет ответственность за сохранение этих данных? Я вижу free (который должен быть delete[]), но я не вижу new в любом месте. Вы просто возвращаете неинициализированный указатель?

Это отличный вариант использования для vector:

class message 
{ 
private: 
    HeaderType header; 
    // Message text 
    std::vector<char> text; 
}; 

std::vector<char>& message::getText() { return text; } 

Какой бы немного лучше, если вы просто передать дескриптор сокета в вашем message так что он может сделать ваш read:

int read(int sd) { 
    text.resize(header.dataSize); 
    return ::read(sd, &text[0], header.dataSize); 
} 
+0

Однако, действительно, связанный список намного лучше. В любом случае, благодарю Вас. – Moi

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