指针和孤立内存管理

时间:2016-11-12 09:17:32

标签: c++ pointers

Firstly here is my code:

头:

#pragma once
#include <iostream>
using namespace std;
class CString
{
private://Main attribute
    char* str;
private:// Aux attribute
    int len;
public:
//constructor and destructor
    CString(char* x);
    CString() { len = 0; str = NULL; }
    ~CString() 
    {
        if (NULL != str) 
            delete[] str;
        str = NULL;
    }
//some operator
    CString operator+(CString x);
    CString operator+(char* x);
    void operator=(CString x);
//operator() is to extract a part of other CString object
    CString operator()(unsigned pos, unsigned c_len);
//operator[] return position of CString::str[pos]
    char& operator[](unsigned pos);
//Ostream output
    friend ostream& operator<<(ostream& os, CString x);
};
//to do char+CString
CString operator+(char* a, CString x);

标题cpp代码:

#include "CString.h"

CString::CString(char * x)
{
    len = 0;
    while(x[len])
        len++;
    str = new char[len];
    for (int i = 0;i < len;i++)
        str[i] = x[i];
    if (str[len - 1] != '\0')
    {
        len++;
        char* tmp;
        tmp = new char[len];
        for (int i = 0;i < len - 1;i++)
            tmp[i] = str[i];
        delete[]str;
        str = tmp;
        tmp = NULL;
        str[len - 1] = '\0';
    }
}

CString CString::operator+(CString x)
{
    CString* result;
    result = new CString;
    result->len = this->len + x.len - 1;
    result.str=new char[result.len];
    for (int i = 0; i < this->len - 1;i++)
    {
        result->str[i] = this->str[i];
    }
    for (int i = 0, j = this->len - 1;i < x.len;i++, j++)
    {
        result->str[j] = x.str[i];
    }
    return *result;
}

CString CString::operator+(char * x)
{
    return CString(*this+CString(x));
}

void CString::operator=(CString x)
{
    str = new char[x.len];
    for (int i = 0; i < x.len;i++)
        str[i] = x.str[i];
    len = x.len;
}

CString CString::operator()(unsigned pos, unsigned c_len)
{
    CString* result;
    result = new CString;
    result->len = c_len;
    result.str=new char[c_len];
    for (int i = pos;i < pos + c_len;i++)
        result->str[i - pos] = str[i];
    return *result;
}

char& CString::operator[](unsigned pos)
{
    if (pos < len - 1)
    {
        char* ptr;
        ptr = this->str + pos;
        return *ptr;
    }
    else
    {
        int o_len = len;
        len = pos + 2;
        char* tmp;
        tmp = new char[len];
        for (int i = 0;i < o_len;i++)
        {
            tmp[i] = str[i];
        }
        tmp[len - 1] = '\0';
        delete[]str;
        str = tmp;
        tmp = NULL;
        return *(str + pos);

    }
}

ostream & operator<<(ostream & os, CString x)
{
    os << x.str;
    return os;
}

CString operator+(char * a, CString x)
{
    return CString(CString(a) + x);
}

主:

            CString a("string 1"), b = "Initialize " + a;
            b[15] = '2'; cout << a + " - " + b << endl;
            CString c = a + b;
            cout << "String extracted from string \"" << c
                << "\" from position 3 with length of 6 is: \""
                << c(3, 6) << "\"" << endl;

问题: 当我尝试编译此程序时,没有错误,但仍然operator+(CString)operator()和析构函数似乎出现故障。

当我调试这个程序时,我的程序触发了一个断点,在CString a("String 1"), b = "initilize " + a;行我不明白为什么。我不知道程序的其余部分是否有任何问题,因为我总是被困在那条线上。所以,如果有人能找到任何其他问题,请告诉我,这将节省我一天。

顺便说一下,我只是想知道operator+(CString)operator(),我创建了一个指针然后我使用new然后我返回那个指针,这样我就不会改变delete那个指针,它会给我一个孤儿记忆吗?由于我已经阅读了关于return类对象的另一个问题,我发现如果我使用CString result然后使用return resultresult将会在返回之前被销毁。那有没有更好的方法呢?

要点: 1.我的程序在第main()行的第二行触发了一个断点。 2.如何正确返回一个类对象?

P.S:我的沟通非常糟糕,只有1年的C / C ++学习期。所以,如果我有类型的东西可以给你一个癌症,请原谅我。

真诚地感谢你。

0 个答案:

没有答案