C ++'C String'实现存在内存分配问题

时间:2017-11-20 04:03:57

标签: c++

我一直在努力解决这个问题,应该是直截了当的。这是一个简单的“C String”实现的开始,它们遍布互联网。但是,我的工作不起作用......当它到达~CString()并调用delete[] _data;时它会崩溃。我不知道为什么。

这是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!");
}

这似乎是一项如此简单的任务,但我已经坚持了几个小时!也许这对其他人来说是一个难题,或者它可能是一个简单的解决方案。我不知道。感谢您提前提供任何帮助。

2 个答案:

答案 0 :(得分:4)

_data = new char(_size);

这是创建一个单个字符,其值为_size

_data = new char[_size];

这可能是你想要的。它构造了一个总长度为_size的字符数组。

答案 1 :(得分:0)

您是否尝试过更换

_data = new char(_size);

_data = new char[_size];

如果我没弄错,通常在初始化数组时使用[]。