C++ 在将元素插入动态数组的背面时,是否有方法防止写入访问冲突?

C++ 在将元素插入动态数组的背面时,是否有方法防止写入访问冲突?,c++,arrays,class,dynamic,C++,Arrays,Class,Dynamic,我想使用insertBack()函数将元素添加到数组的后面;但是,当我尝试这样做时,我得到了一个错误: 引发未处理的异常:写入访问冲突。这个->arr是 0x1110116 我不确定我做错了什么;我的教授的职位和先决条件让我感到困惑。我也不知道如何使用allocate,也不知道我将容量加倍的方法是否正确 容器类别: #包括 模板 类容器 { 模板 friend std::ostream&operator当您使用insertback()和size()>=Capacity时,数组并没有真正展开。您只

我想使用
insertBack()
函数将元素添加到数组的后面;但是,当我尝试这样做时,我得到了一个错误:

引发未处理的异常:写入访问冲突。这个->arr是 0x1110116

我不确定我做错了什么;我的教授的职位和先决条件让我感到困惑。我也不知道如何使用allocate,也不知道我将容量加倍的方法是否正确

容器类别:

#包括
模板
类容器
{
模板

friend std::ostream&operator当您使用
insertback()
size()>=Capacity
时,数组并没有真正展开。您只需将名为
Capacity
的变量加倍,但数组本身实际上并没有加倍

您可以尝试使用以下代码将数组加倍,如下所示:

T* old_array = arr; arr = new T[Capacity<<=1];  //double array
for(int i=0;i<n;++i) arr[i]=old_array[i]   //copy you can use memcpy instead for loop
delete [] old_array;    //free space

T*old_array=arr;arr=new T[Capacity当您使用
insertback()
size()>=Capacity
时,您的数组不会真正展开。您只需将名为
Capacity
的变量加倍,但数组本身实际上并没有加倍

您可以尝试使用以下代码将数组加倍,如下所示:

T* old_array = arr; arr = new T[Capacity<<=1];  //double array
for(int i=0;i<n;++i) arr[i]=old_array[i]   //copy you can use memcpy instead for loop
delete [] old_array;    //free space

T*old_array=arr;arr=new T[Capacity
container::insertBack
Capacity
值加倍,但实际上不分配任何额外内存。@tedlynmo我可以去掉isempty和isfull函数,嗯。@tedlynmo哦,确实是这样。这似乎是一个非常明显的错误。我对clang拥有它感到惊讶(Clang 10现在有一个错误),即使是
-pedantic错误
。确定:
模板void container::allocate(T*&temp){if(Capacity==0){temp=new T;}else{return Capacity*2;}
此函数有时返回
Capacity*2
-但是…是
void
。这本身就使得您的程序具有未定义的行为。@RemyLebeau是的,当然。我删除了我的误导性评论。在任何情况下
返回Capacity*2;
中声明为
void
中的
都是格式错误的,应该导致编译器诊断。
container::insertBack
容量
值增加一倍,但实际上没有分配任何额外内存。@TEDLYNGOM我可以去掉isempty和isfull函数,嗯。@TEDLYNGOM哦,确实如此。这似乎是一个非常明显的错误。我很惊讶clang有这个错误(Clang 10现在有一个错误),即使是
-pedantic错误
。确定:
模板void container::allocate(T*&temp){if(Capacity==0){temp=new T;}else{return Capacity*2;}
此函数有时返回
Capacity*2
-但是…是
void
。这本身就使得您的程序具有未定义的行为。@RemyLebeau是的,当然。我删除了我的误导性评论。在任何情况下
返回Capacity*2;
中声明为
void
中的
都是格式错误的,应该导致编译器诊断。若要将容器的容量设置为默认值,我是否应该为其分配0?只需将其保留为声明状态?我在理解此处发生的事情时遇到了一些困难
new T[capacity
new T[capacity“您可以使用memcpy代替循环”-如果容器的数组不包含普通类型的元素,则使用
memcpy()
复制元素是不安全的。您可以使用
std::copy()
来代替,它将始终根据元素的实际类型“做正确的事”来复制元素,并且它将使用
memcpy()
如果这样做是安全的,请在内部执行。要将容器的容量设置为默认值,我是否应该不为其分配0?只需将其保留为声明状态?我在理解此处发生的情况时遇到了一点困难
new T[capacity
new T[capacity“您可以使用memcpy代替循环”-如果容器的数组不包含普通类型的元素,则使用
memcpy()
来复制元素是不安全的。您可以使用
std::copy()
来代替,它将始终根据元素的实际类型“做正确的事情”,如果安全的话,它将在内部使用
memcpy()