当更改类的私有部分时,访问冲突写入位置,c++
Access violation writing location when changing private part of a class, c++
我正在写一个Deque(不接受STL,主要思想是自己写Deque)。得到一个:
Unhandled exception at 0x009932C1 in Deque.exe: 0xC0000005:
Access violation writing location 0xFFFFFFFC.
问题在行:
buffer[tail++] = element;
我想改变一个元素,它在类中是私有的。会是什么问题呢?
在Visual Studio 2012中工作,语言- c++。代码:
#include "stdafx.h"
#include <iostream>
#include <cassert>
#include <deque>
using namespace std;
class Deque
{
public:
void PushBack( int element );
bool IsEmpty() const { return head == tail; }
void clearDeque();
void setBufSize( size_t size )
{
bufferSize = size;
int* buffer = new int[bufferSize];
for (size_t i = 0; i < bufferSize; i++)
buffer[i] = 0;
}
int getDeque()
{
while ( head != tail )
{
if ( head == bufferSize )
{
head = 0;
}
return buffer[head++];
}
}
private:
int* buffer;
int bufferSize;
int head;
int tail;
};
void Deque :: PushBack( int element )
{
buffer[tail++] = element;
if ( ( tail == bufferSize ) && ( tail != head ) )
tail = 0;
}
int main()
{
Deque myDeque;
deque <int> TrueDeque;
myDeque.setBufSize(15);
myDeque.PushBack(44);
return 0;
}
(除了其他人注意到的关于初始化成员变量失败的问题)
您使用了多个具有相同名称的变量,可能是无意的。
在成员函数
中void setBufSize( size_t size )
{
bufferSize = size;
int* buffer = new int[bufferSize];
for (size_t i = 0; i < bufferSize; i++)
buffer[i] = 0;
}
buffer
是一个局部变量。您没有使用或更新同名的成员变量。
尝试一个简单的赋值buffer = new int[bufferSize];
代替变量声明。或者更好,使用std::vector
代替。
应该在构造函数中初始化每个成员。在你的代码中,你使用tail
没有初始化它,所以它有一些随机值。
您在哪里初始化尾部?(或负责人)
我建议您在您的构造函数中这样做,以便您可以利用RAII范例,如果您还需要其他资源。
您的类没有初始化其数据成员。由于它们都是原始类型(int
和int*
),读取它们的值会产生未定义的行为,即任何事情都可能发生,包括随机崩溃。具体来说,在您的例子中,head
和tail
被读取,但从未被赋值或初始化。
你的类需要一个带有初始化列表的构造函数。例如:
Deque::Deque() :
buffer(0),
bufferSize(0),
head(0),
tail(0)
{
}
实际上,去掉setBufSize
并将其功能直接移到构造函数中(以及在适用的初始化列表中)。
头和尾都没有初始化。
setBufSize函数也不检查缓冲区是否已经分配。在这种情况下,当您多次调用该函数时,就会发生内存泄漏。
void setBufSize( size_t size )
{
bufferSize = size;
int* buffer = new int[bufferSize];
for (size_t i = 0; i < bufferSize; i++)
buffer[i] = 0;
}
我想语句
有一个错字。int* buffer = new int[bufferSize];
应该有
buffer = new int[bufferSize];
如果你的类没有显式构造函数,或者在类定义中添加初始化器,你至少可以在这个成员函数中初始化head和tail。例如
//...
private:
int* buffer = nullptr;
int bufferSize = 0;
int head = 0;
int tail = 0;
类需要定义析构函数、复制赋值操作符和复制构造函数,或者将后两者定义为删除
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 读取访问冲突.这0xCDCDCDCD
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 插入数组时违反写访问冲突
- 使用 ReadProcessMemory 获取字符串值的访问冲突
- 尝试通过共享指针使用变量时读取访问冲突
- 堆栈上的 C++ 访问冲突写入异常
- 引发异常:写访问冲突. temp 为 nullptr
- 将静态字符数组中的字符分配给动态分配的字符数组 - 访问冲突
- 在C++中删除双向链表的头节点后出现访问冲突异常
- C++ 读取访问冲突,0xCDCDCDCD