私はこれをかなりの間苦労してきました。これはインターネット上にある単純な「C String」実装の始まりです。しかし、鉱山は機能しません... ~CString()
に達し、delete[] _data;
と呼ぶとクラッシュします。どうしてか分かりません。C++ 'C String'実装にメモリ割り当ての問題があります
ここCString.h
#ifndef CSTRING_H
#define CSTRING_H
#include <cstring> // strlen
class CString
{
char* _data;
unsigned int _size;
unsigned int _length;
public:
CString();
CString(const char* data_);
CString(const char* data_, unsigned int size_);
CString(const CString& other_);
~CString();
const char* get_data() const;
unsigned int get_size() const;
unsigned int get_length() const;
void assign();
void assign(const char* data_);
void assign(const char* data_, unsigned int size_);
};
#endif // CSTRING_H
がCString.cpp
が#include "./CString.h"
CString::CString()
{
_data = 0;
_size = 0;
_length = 0;
}
CString::CString(const char* data_)
{
_size = strlen(data_) + 1;
_length = strlen(data_);
_data = new char(_size);
strncpy(_data, data_, _size);
}
CString::CString(const char* data_, unsigned int size_)
{
_size = size_;
_length = size_;
_data = new char(_size);
strncpy(_data, data_, _size);
}
CString::CString(const CString& other_)
{
_size = other_._size;
_length = other_._length;
_data = new char(_size);
strncpy(_data, other_._data, _size);
}
CString::~CString()
{
if (_data)
{
delete[] _data;
}
}
const char* CString::get_data() const
{
return _data;
}
unsigned int CString::get_size() const
{
return _size;
}
unsigned int CString::get_length() const
{
return _length;
}
void CString::assign()
{
if (_data)
{
delete[] _data;
}
_size = 0;
_length = 0;
_data = 0;
}
void CString::assign(const char* data_)
{
if (_data)
{
delete[] _data;
}
_size = strlen(data_) + 1;
_length = strlen(data_);
_data = new char(_size);
strncpy(_data, data_, _size);
}
void CString::assign(const char* data_, unsigned int size_)
{
if (_data)
{
delete[] _data;
}
_size = size_;
_length = size_;
_data = new char(_size);
strncpy(_data, data_, _size);
}
され、最終的に、ここにすべてのmain.cppにはやっているです。ここです:
int main(int argc_, char** argv_)
{
CString info_message("Hello world!");
}
これはそのように思える簡単な仕事ですが、私は数時間それに固執してきました!たぶんそれは誰か他の人に困惑しているのでしょうか、それとも本当に簡単な修正です。知りません。事前に助けてくれてありがとう。
'CString'の代入演算子がありません。 'CString message2;を実行した場合、問題があることがわかります。 message2 = info_message; ' – PaulMcKenzie