访问冲突指针错误

时间:2016-02-15 06:27:20

标签: c++ pointers

我正在实现我的基本String类的版本,但是我遇到了一个我以前从未见过的问题,并且不知道如何正确调试。我的代码粘贴在下面。所有函数都有它们的标题对应物。我的测试只是使用转换构造函数创建一个对象。

A4String obj1("this");

我的问题是我收到了一个Access违规读取位置异常。我的研究表明,我可能试图在Visual Studio的分配之外访问内存。我很难找到这个指针错误存在的位置。我已经在转换构造函数和后续函数调用的每一步中放置了断点,但是我的程序在它返回main之前不会抛出异常,似乎在我的程序完全执行之后。

#include "A4String.h"



A4String::A4String() {
    data = new char[5];
    data[0] = '\0';
    capacity = 5;

}

A4String::~A4String() {
    if (capacity != 0)
        delete[] data;

}
//Copy Constructor
A4String::A4String(const A4String &right) {
    cout << "copy" << endl;

    data = new char[right.capacity + 1];
    strcpy(data, right.data, capacity);
    capacity = right.capacity;

}
//Convert Constructor 
A4String::A4String(const char *sptr) {
    cout << "convert" << endl;
    capacity = (strlen(sptr)) + 1;
    data = new char[capacity + 1];
    strcpy(sptr, data, capacity);

}
//Assignment
A4String& A4String::operator = (const A4String & right) {
    //if (capacity != 0) delete[] data;
    data = new char[right.capacity + 1];
    strcpy(data, right.data, capacity);
    capacity = right.capacity;
    return *this;
}
//Equivalence
bool A4String::operator == (const A4String &right) const {
    return (strcmp(data, right.data)) == 0;

}

int A4String::length() const {
    return capacity;
}

void A4String::addChar(char) {
    //Not implemented yet
}

string A4String::toString() {
    string str = "";
    int i = 0;
    while (data[i] != '\0') {
        str += data[i];
        i++;
    }
    return str; 
}

void A4String::strcpy(const char *source, char* destination, int size)
{
    for (int i = 0; i < 20; i++)
        destination[i] = '\0';
    int  index = 0;
    while (source[index] != '\0')
        {
        destination[index] = source[index];
        index++;
        }
    destination[index] = '\0';


}

int A4String::strcmp(char *str1,  char *str2)
{

    if (*str1 < *str2)
        return -1;

    if (*str1 > *str2)
        return 1;

    if (*str1 == '\0')
        return 0;

    return strcmp(str1 + 1, str2 + 1);

     return 0;
     }

int A4String::strlen( char *s)
{
    char *start;
    start = s;
    while (*s != 0)
    {
        ++s;
    }
    return s - start;
}

2 个答案:

答案 0 :(得分:2)

问题在于您的A4String::strcpy

for (int i = 0; i < 20; i++)
    destination[i] = '\0';

目的地少于20个字符,因此崩溃。

答案 1 :(得分:0)

20中使用硬编号A4String::strcpy是不对的。我建议将其更改为size

void A4String::strcpy(const char *source, char* destination, int size)
{
    // for (int i = 0; i < 20; i++)
    for (int i = 0; i < size; i++)
        destination[i] = '\0';
    int  index = 0;

    // Add an additional check here also.
    // while (source[index] != '\0' )
    while (source[index] != '\0' && index < size)
        {
        destination[index] = source[index];
        index++;
        }
    destination[index] = '\0';
}

免责声明修复上述功能可能无法修复崩溃问题,即使使用20很可能会导致程序崩溃。换句话说,您的代码中也可能存在其他问题。