gpt4 book ai didi

c++ - 异常错误 : Access violation reading location 0xDDDDDDDD

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:57 25 4
gpt4 key购买 nike

我正在尝试用 C++ 创建一个动态字符串数组。当尝试将我的动态字符串数组的内容显示到控制台时,我收到此错误:

Exception thrown at 0x0FD670B6 (msvcp140d.dll) in Assignment4.exe: 0xC0000005: Access violation reading location 0xDDDDDDDD.

这是我的代码:

DynamicStringArray.h

#pragma once
#include "stdafx.h"
#include <string>
#include <iostream>

using namespace std;

class DynamicStringArray
{
public:
DynamicStringArray();
DynamicStringArray(DynamicStringArray &array);
~DynamicStringArray();
int getSize();
void displayContents();
void addEntry(const string &addElement);
string getEntry(int index);
int deleteEntry(const string &deleteElement);

private:
string *dynamicArray;
int size;
};

动态字符串数组.cpp

#include "stdafx.h"
#include "DynamicStringArray.h"
#include <string>
#include <iostream>

using namespace std;

DynamicStringArray::DynamicStringArray()
{
dynamicArray = NULL;
size = 0;
}

DynamicStringArray::DynamicStringArray(DynamicStringArray &array)
{
if (dynamicArray != NULL)
{
size = 0;
delete [] dynamicArray;
dynamicArray = NULL;
}

size = array.getSize();
dynamicArray = new string[size];
for (int i = 0; i < size; i++)
dynamicArray[i] = array.dynamicArray[i];
}

DynamicStringArray::~DynamicStringArray()
{
cout << "In destructor." << endl;
delete [] dynamicArray;
dynamicArray = NULL;
}

int DynamicStringArray::getSize()
{
return size;
}

void DynamicStringArray::displayContents()
{
if (size != 0)
for (int i = 0; i < size; i++)
cout << "Item-" << i << ": " << dynamicArray[i] << endl;
else
cout << "Array is empty." << endl;
}

void DynamicStringArray::addEntry(const string &addElement)
{
string *temp = new string[size + 1];
for (int i = 0; i < size; i++)
temp[i] = dynamicArray[i];
temp[size] = addElement;
size++;
delete [] dynamicArray;
dynamicArray = temp;
delete[] temp;
}

string DynamicStringArray::getEntry(int index)
{
if ((index >= 0) && (index < size))
{
return dynamicArray[index];
}
return NULL;
}

int DynamicStringArray::deleteEntry(const string &deleteElement)
{
if(size == 0)
{
return false;
}

for (int i = 0; i < size; i++)
{
if (dynamicArray[i] == deleteElement)
{
string *temp = new string[size - 1];
for (int x = 0; x < size - 1; ++x)
{
if (x < i)
temp[x] = dynamicArray[x];
else
temp[x] = dynamicArray[x + 1];
}

delete[] dynamicArray;
dynamicArray = temp;
delete[] temp;
--size;
return true;
}
}

return false;
}

主要内容:

int main()
{
DynamicStringArray dsArray1;
cout << "dsArray1.displayContents():" << endl;
dsArray1.displayContents(); // Should indicate array is empty
cout << "Display dsArray1.getSize()= " << dsArray1.getSize() << endl;

dsArray1.addEntry("Entry-A");
dsArray1.displayContents();

dsArray1.addEntry("Entry-B");
dsArray1.displayContents();
dsArray1.addEntry("Entry-C");
dsArray1.displayContents();
return 0;
}

谁能告诉我我做错了什么。我该如何解决这个问题?

最佳答案

请注意,所有这些都可以通过使用 std::vector<std::string> . std::vector class 是 C++ 提供的动态数组类,几乎没有理由为您提供可用的自制版本。


话虽如此,一个明显的问题是您的复制构造函数不正确。 dynamicArray未初始化,但您在这里使用它:

if (dynamicArray != NULL)

无法保证什么值dynamicArray已。解决方法是删除复制构造函数中的整个代码块:

if (dynamicArray != NULL)
{
size = 0;
delete [] dynamicArray;
dynamicArray = NULL;
}

既然复制构造函数构造了一个全新的对象,就没有理由去“预测试”一个NULL指针,从而做一些不必要的工作。请记住,该对象不存在,因此无需做任何准备工作。


第二个问题是您发出了 delete [] temp;调用addEntrydeleteEntry职能。删除这些行,因为您正在释放刚刚分配给 dynamicArray 的内存.


第三个问题是您缺少用户定义的赋值运算符。赋值运算符具有以下签名,您需要提供实现:

DynamicStringArray& operator=(const DynamicStringArray& );

没有这个函数,分配一个DynamicStringArray到另一个DynamicStringArray当两个对象都超出范围时,将导致内存泄漏和内存的双重释放。

一个实现可以使用 copy / swap idiom :

#include <algorithm>
//...
DynamicStringArray& DynamicStringArray::operator=(const DynamicStringArray& rhs)
{
DynamicStringArray temp(rhs);
std::swap(temp.dynamicArray, dynamicArray);
std::swap(temp.size, size);
return *this;
}

另一个问题是:

string DynamicStringArray::getEntry(int index)
{
if ((index >= 0) && (index < size))
{
return dynamicArray[index];
}
return NULL; // <-- Undefined behavior if this is done
}

分配 std::string 是未定义的行为带有 NULL 的对象。要么返回空字符串,要么在索引越界时抛出异常。


总而言之,我强烈建议您继续阅读 Rule of 3在设计必须实现正确复制语义的类时。

关于c++ - 异常错误 : Access violation reading location 0xDDDDDDDD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34348110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com