一切都执行后的分段错误 - 动态内存分配:c ++

时间:2018-04-04 18:25:09

标签: c++ memory dynamic allocation

我对动态内存分配相当新,遇到了麻烦。我认为问题在我的分配功能范围内,但我可能是错的。这是MyString.cpp文件。

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "MyString.h"
using namespace std;

MyString::MyString()
{
    m_size = 0;
    buffer_allocate(0);

}
MyString::MyString(const char * str)
{
    m_size = strlen(str);
    buffer_allocate(m_size);

    for(int i = 0; i < m_size; i++)
    {
        m_buffer[i] = str[i];
    }
}
MyString::MyString(const MyString & other_myStr)
{
    m_size = other_myStr.size();
    buffer_allocate(other_myStr.size());
    for(int i = 0; i < other_myStr.size(); i++)
    {
        m_buffer[i] = other_myStr.c_str()[i];
    }
}
void MyString::buffer_deallocate()
{
    delete[] m_buffer;
    m_size = 0;
}
void MyString::buffer_allocate(size_t size)
{
    try
    {
            m_buffer = new char[size];
    }
    catch(bad_alloc& ex)
    {

        delete[] m_buffer;
    }
}
MyString::~MyString()
{
    buffer_deallocate();
}
size_t MyString::size() const
{
    return m_size;
}
size_t MyString::length() const
{
    return m_size - 1;
}
const char* MyString::c_str() const
{
    char * arr = (char*) malloc(m_size + 1);
    int i;
    for(i = 0; i < m_size; i++)
    {
        arr[i] = m_buffer[i];
    }
    arr[i] = '\0';
    return arr;
}
bool MyString::operator== (const MyString & other_myStr) const
{
    for(int i = 0; (i < m_size) && (i < other_myStr.size()); i++)
    {
        if(m_buffer[i] != other_myStr.c_str()[i])
        {
            return false;
        }

    }
    if(m_size != other_myStr.size())
    {
        return false;
    }
    return true;
}
MyString & MyString::operator= (const MyString & other_myStr)
{
    buffer_deallocate();
    buffer_allocate(other_myStr.size());
    for(int i = 0; i < other_myStr.size(); i++)
    {
        m_buffer[i] = other_myStr.c_str()[i];
    }
    return *this;
}
MyString MyString::operator+ (const MyString & other_myStr) const
{
    int length = this->size() + other_myStr.size();
    char * temp = (char*)malloc(length);
    int j = 0;
    for(int i = 0; i < length; i++)
    {
        if(i < this->size())
        {
            temp[i] = m_buffer[i];
        }
        else
        {
            temp[i] = other_myStr.c_str()[j];
            j++;

        }
    }
    MyString rhs = MyString(temp);
    return rhs;
}
char & MyString::operator[] (size_t index)
{
    return m_buffer[index];
}
const char & MyString::operator[] (size_t index) const
{
    return m_buffer[index];
}
std::ostream & operator<<(std::ostream & os, const MyString & myStr)
{
    for(int i = 0; i < myStr.size(); i++)
    {
        os << myStr[i];
    }
    os << endl;
}

就像我说的那样,整个程序执行后发生了分段错误,所以我的猜测是存在一些内存泄漏问题。我提前感谢你的帮助。 这是主要功能:

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include "MyString.h"
using namespace std;

int main(void)
{
    MyString dft;
    if(dft.size() == 0)
    {
        cout << "Successful Default c-tor" << endl;
    }
    MyString param("Successful Parameter c-tor");
    MyString copy(dft);
    cout << param;
    MyString ms_size_length("Size and length test:");
    cout << ms_size_length;
    cout << "Size of MyString: " << ms_size_length.size() << endl;
    cout << "Length of MyString: " << ms_size_length.length() << endl; 
    MyString ms_toCstring("C-String equivalent successfully obtained!");
    cout << ms_toCstring.c_str() << endl; 
    MyString ms_same1("The same"), ms_same2("The same"); 
    if (ms_same1==ms_same2)   
    {
        cout << "Same success" << endl; 
    }
    MyString ms_different("The same (NOT)");
    if (!(ms_same1==ms_different))
    {
        cout << "Different success" << endl; 
    }
    MyString ms_assign("Before assignment"); 
    ms_assign = MyString("After performing assignment"); 
    MyString ms_append1("The first part"); 
    MyString ms_append2(" and the second"); 
    MyString ms_concat = ms_append1 + ms_append2; 
    cout << ms_concat;
    MyString ms_access("Access successful (NOT)"); 
    ms_access[17] = 0; 
    cout << ms_access;

}

1 个答案:

答案 0 :(得分:0)

我注意到的一个问题是:

m_size = strlen(str);
buffer_allocate(m_size);

分配少于你需要的字符数。因此,您最终不会将终止空字符复制到对象的m_buffer

我建议将构造函数更改为:

MyString::MyString(const char * str)
{
    m_size = strlen(str)+1;
    buffer_allocate(m_size);
    strcpy(m_buffer, str);
}

PS 我没有在您的代码中查找其他问题。可能会有更多或没有。