C++初学者删除代码

Poo*_*och 1 c++ delete-operator

我试图动态地分配内存到堆,然后删除分配的内存.下面的代码让我很难过:

// String.cpp
#include "String.h"

String::String() {}

String::String(char* source)
{
 this->Size = this->GetSize(source);
 this->CharArray = new char[this->Size + 1];
 int i = 0;
 for (; i < this->Size; i++) this->CharArray[i] = source[i];
     this->CharArray[i] = '\0';
}

int String::GetSize(const char * source)
{
 int i = 0;
        for (; source[i] != '\0'; i++);
        return i;
}

String::~String()
{
 delete[] this->CharArray;
}
Run Code Online (Sandbox Code Playgroud)

以下是编译器尝试删除CharArray时出现的错误:

0xC0000005:访问冲突读取位置0xccccccc0.

这是堆栈上的最后一次调用:

msvcr100d.dll!operator delete(void*pUserData)第52行+ 0x3字节C++

我相当肯定这段代码中存在错误,但会为您提供所需的任何其他信息.哦,是的,使用VS 2010 for XP.

编辑:继承我的String.h

// String.h - string class
#pragma once

#define NOT_FOUND -1

class String
{
public:
    String();
    String(char* source);
    static int GetSize(const char * source);
    int Find(const char* aChar, int startPosition = 0);
    ~String();
private:
    char* CharArray;
    int Size;
};
Run Code Online (Sandbox Code Playgroud)

das*_*ang 5

更改您的默认ctor; 鉴于你得到的错误,删除调用试图删除一个从未初始化的指针.

String::String() : Size(0), CharArray(NULL) {}
Run Code Online (Sandbox Code Playgroud)

另外,要注意"复制构造函数".您可能希望将其设为私有,以确保您不会隐式触发它.(如果你不打算调用它,就不需要实现,只需将函数原型粘贴到类定义中.)同样可以"禁用"赋值运算符.

class String
{
   // other stuff

private:
    String(String&);
    String& operator=(String&);
};
Run Code Online (Sandbox Code Playgroud)

这个加法实现了"三个规则",它表示如果任何类需要析构函数,复制构造函数或赋值运算符,它可能需要全部三个.

编辑:请参阅http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29