Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为阵列重新分配内存?_C++ - Fatal编程技术网

C++ 为阵列重新分配内存?

C++ 为阵列重新分配内存?,c++,C++,身体 #包括“IntVector.h” #包括 #包括 #包括 使用名称空间std; IntVector::IntVector(){ sz=0; 上限=0; 数据=空; } IntVector::IntVector(无符号大小){ 如果(大小=0){ cap=1; 尺寸=1; 数据=新整数[sz]; for(无符号整数i=0;i上限){ INTA=上限*2; int b=n-上限; 如果(a>b){ 扩大(a); } 否则{ 扩大(b); } } 数据=新整数[sz]; *数据=价值; } in

身体

#包括“IntVector.h”
#包括
#包括
#包括
使用名称空间std;
IntVector::IntVector(){
sz=0;
上限=0;
数据=空;
}
IntVector::IntVector(无符号大小){
如果(大小=0){
cap=1;
尺寸=1;
数据=新整数[sz];
for(无符号整数i=0;i0){
返回false;
}
否则{
返回true;
}
}
常量int&IntVector::at(无符号索引)常量{
如果(指数>sz){
出口(1);
}
否则{
返回数据[索引];
}
}
常量int&IntVector::front()常量{
返回数据[0];
}
常量int&IntVector::back()常量{
返回数据[sz-1];
}
IntVector::~IntVector(){
删除[]数据;
}
void IntVector::expand(){
如果(上限==0){
cap=1;
}
cap=cap*2;
int*数据拷贝=新int[cap];
for(无符号整数i=0;isz | |上限==0){
出口(1);
}
否则{
sz+=1;
如果(sz=上限){
展开();
}
for(无符号整数i=0;i索引){
数据[i-1]=数据[i];
}
}
}
}
void IntVector::erase(无符号索引){
如果(指数>sz | |上限==0){
出口(1);
}
否则{
for(无符号整数i=0;i上限){
展开();
}
数据[sz]=值;
}
void IntVector::pop_back(){
如果(sz<0 | |上限sz){
int a=大小-sz;
for(无符号整数i=a;i上限){
int b=上限*2;
int c=sz-上限;
如果(b>c){
展开();
}
否则{
扩大(c);
}
}
}
void IntVector::reserve(未签名的n){
INTA=上限*2;
int b=n-上限;
如果(a>b){
扩大(a);
}
否则{
扩大(b);
}
}
void IntVector::assign(无符号n,int值){
sz=n;
如果(sz>上限){
INTA=上限*2;
int b=n-上限;
如果(a>b){
扩大(a);
}
否则{
扩大(b);
}
}
数据=新整数[sz];
*数据=价值;
}
int&IntVector::at(无符号索引){
如果(指数>=sz){
出口(1);
}
返回数据[索引];
}
int&IntVector::front(){
返回数据[0];
}
int&IntVector::back(){
返回数据[sz-1];
}
(摘自评论)


读取
*data=*data2
的每一行都应该读取
data=data2
。将星号放在前面会取消指针的引用;这不是您想要做的

(对经编辑的问题的答复)

默认构造函数设置
data=NULL
。当您尝试删除此指针时,将出现错误。在
delete[]data
之前,应始终检查
if(data!=NULL)


(另外,另一个构造函数有
*data=0
。这可能是不对的。如果你想把整个事情归零,你可以使用
memset
ZeroMemory
…或
for
循环,就像在其他函数中一样。)

首先,你实际上有重复的expand()函数。您应该从不提供参数的函数调用1参数展开函数

#include "IntVector.h"
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;



IntVector::IntVector(){
    sz = 0;
    cap = 0;
    data = NULL;
}

IntVector::IntVector(unsigned size){
    if(size = 0){
        cap = 1;
        size = 1;
        data = new int[sz];
        for(unsigned int i = 0; i < sz; i++){
        data[i] = 0;
        }
    }
    sz = size;
    cap = size;
    data = new int[sz];
    for(unsigned int i = 0; i < sz; i++){
        data[i] = 0;
    }
}

IntVector::IntVector(unsigned size, int value){
    if(size = 0){
        cap = 1;
        size = 1;
        data = new int[sz];
        for(unsigned int i = 0; i < sz; i++){
        data[i] = 0;
        }
    }
    sz = size;
    cap = size;
    data = new int[sz];
    for(unsigned int i = 0; i < sz; i++){
        data[i] = value;
    }
}

unsigned IntVector::size() const{
    return sz;
}

unsigned IntVector::capacity() const{
    return cap;
}

bool IntVector::empty() const{
    if(sz > 0){
        return false;
    }
    else{
        return true;
    }
}

const int &IntVector::at(unsigned index) const{
    if(index > sz){
        exit(1);
    }
    else{
        return data[index];
    }
}

const int &IntVector::front() const{
    return data[0];
}

const int &IntVector::back() const{
    return data[sz - 1];
}

IntVector::~IntVector(){
    delete[] data;
}

void IntVector::expand(){
    if(cap == 0){
        cap = 1;
    }
    cap = cap * 2;
    int* data_copy = new int[cap];
    for (unsigned int i = 0; i < sz; i++){
        data_copy[i] = data[i];
    }
    delete[] data;
    data = data_copy;
}

void IntVector::expand(unsigned amount){
    if(cap == 0){
        cap = 1;
    }
    cap += amount;
    int *data_copy = new int[cap];
    for (unsigned int i = 0; i < sz; i++){
        data_copy[i] = data[i];
    }
    //copy(data, data + sz, data_copy);
    delete[] data;
    data = data_copy;

}



void IntVector::insert(unsigned index, int value){
    if(index > sz || cap == 0){
        exit(1);
    }
    else{
        sz += 1;
        if(sz = cap){
            expand();
        }

        for(unsigned int i = 0; i <= sz; i++){
            if(i = index){
                data[i] = value;
            }
            if(i > index){
                data[i - 1] = data[i];
            }
        }
    }
}

void IntVector::erase(unsigned index){
    if(index > sz || cap == 0){
        exit(1);
    }
    else{
        for(unsigned int i = 0; i <= sz; i++){
            if(i = index){
                data[i] = data[i + 1];
            }
        }
        sz -= 1;
    }
}

void IntVector::push_back(int value){
    sz += 1;
    if(sz > cap){
        expand();
    }
    data[sz] = value;
}

void IntVector::pop_back(){
    if(sz < 0 || cap <= 0){
        exit(1);
    }
    sz -= 1;
}

void IntVector::clear(){
    sz = 0;
}

void IntVector::resize(unsigned size, int value){
    if(size < sz){
        sz = size;
    }
    else if(size > sz){
        int a = size - sz;
        for (unsigned int i = a; i < size; i++){
            data[i] = value;
        }
    }
    if(sz > cap){
        int b = cap * 2;
        int c = sz - cap;
        if(b > c){
            expand();
        }
        else{
            expand(c);
        }
    }
}

void IntVector::reserve(unsigned n){
    int a = cap * 2;
    int b = n - cap;
    if(a > b){
        expand(a);
    }
    else{
        expand(b);
    }
}

void IntVector::assign(unsigned n, int value){
    sz = n;
    if(sz > cap){
        int a = cap * 2;
        int b = n - cap;
        if(a > b){
            expand(a);
        }
        else{
            expand(b);
        }
    }
    data = new int[sz];
    *data = value;
}

int & IntVector::at(unsigned index){
    if(index >= sz){
        exit(1);
    }
    return data[index];
}

int & IntVector::front(){
    return data[0];
}

int & IntVector::back(){
    return data[sz - 1];
}
现在,您将使用带有一个参数的expand()函数

void IntVector::expand() 
{
    expand(cap * 2);
}
}

这段代码没有本质上的错误(请注意,我刚刚返回,没有调用exit(1))。此外,还将检查容量,以确保您确实需要更改容量

因此,你需要发布你的测试工具,以及你班上的其他人。我们不知道你是如何使用这门课的

现在谈谈这一点:

void IntVector::expand(unsigned amount)
{
   if (cap == 0 || sz == 0 || amount == 0)
     return;
   cap += amount;
   int *data2 = new int[cap];
   std::copy(data, data + sz, data2);
   delete[] data;
   data = data2;

如果传递的大小为0,则该代码将失败。是的,从技术上讲,您可以分配大小为0的数组,但您不能像在那一行中那样取消对该内存的引用。你应该检查大小是否为0。

你不是已经问过了吗?我对代码做了建议的调整,但是类的测试工具仍然有很多问题。每一行读
*data=*data2
应该读
data=data2
。将星号放在前面会解除指针的引用;这不是您想要做的。@Patrick87我将它们分配给data=data2,但是我遇到了很多问题。您在修复代码时会遇到什么错误?建议更新帖子以反映您当前遇到错误的代码。使用修订后的代码编辑了我的原始问题。它仍然给我带来测试工具的问题,因为它一直说存在未定义的行为。该函数的作业说“将IntVector的大小和容量设置为传入参数的值,并动态分配该大小的数组。(不要忘记将数组中的所有值初始化为0)。”编辑:上传我的完整标题和正文。
#ifndef INTVECTOR_H
#define INTVECTOR_H

using namespace std;
class IntVector{
private:
    unsigned sz;
    unsigned cap;
    int *data;
public:
    IntVector();
    IntVector(unsigned size);
    IntVector(unsigned size, int value);
    unsigned size() const;
    unsigned capacity() const;
    bool empty() const;
    const int & at (unsigned index) const;
    const int & front() const;
    const int & back() const;
    ~IntVector();
    void insert(unsigned index, int value);
    void erase(unsigned index);
    void push_back(int value);
    void pop_back();
    void clear();
    void resize(unsigned size);
    void resize(unsigned size, int value);
    void reserve(unsigned n);
    void assign(unsigned n, int value);
    int & at(unsigned index);
    int & front();
    int & back();
private:
    void expand();
    void expand(unsigned amount);
};

#endif
#include "IntVector.h"
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;



IntVector::IntVector(){
    sz = 0;
    cap = 0;
    data = NULL;
}

IntVector::IntVector(unsigned size){
    if(size = 0){
        cap = 1;
        size = 1;
        data = new int[sz];
        for(unsigned int i = 0; i < sz; i++){
        data[i] = 0;
        }
    }
    sz = size;
    cap = size;
    data = new int[sz];
    for(unsigned int i = 0; i < sz; i++){
        data[i] = 0;
    }
}

IntVector::IntVector(unsigned size, int value){
    if(size = 0){
        cap = 1;
        size = 1;
        data = new int[sz];
        for(unsigned int i = 0; i < sz; i++){
        data[i] = 0;
        }
    }
    sz = size;
    cap = size;
    data = new int[sz];
    for(unsigned int i = 0; i < sz; i++){
        data[i] = value;
    }
}

unsigned IntVector::size() const{
    return sz;
}

unsigned IntVector::capacity() const{
    return cap;
}

bool IntVector::empty() const{
    if(sz > 0){
        return false;
    }
    else{
        return true;
    }
}

const int &IntVector::at(unsigned index) const{
    if(index > sz){
        exit(1);
    }
    else{
        return data[index];
    }
}

const int &IntVector::front() const{
    return data[0];
}

const int &IntVector::back() const{
    return data[sz - 1];
}

IntVector::~IntVector(){
    delete[] data;
}

void IntVector::expand(){
    if(cap == 0){
        cap = 1;
    }
    cap = cap * 2;
    int* data_copy = new int[cap];
    for (unsigned int i = 0; i < sz; i++){
        data_copy[i] = data[i];
    }
    delete[] data;
    data = data_copy;
}

void IntVector::expand(unsigned amount){
    if(cap == 0){
        cap = 1;
    }
    cap += amount;
    int *data_copy = new int[cap];
    for (unsigned int i = 0; i < sz; i++){
        data_copy[i] = data[i];
    }
    //copy(data, data + sz, data_copy);
    delete[] data;
    data = data_copy;

}



void IntVector::insert(unsigned index, int value){
    if(index > sz || cap == 0){
        exit(1);
    }
    else{
        sz += 1;
        if(sz = cap){
            expand();
        }

        for(unsigned int i = 0; i <= sz; i++){
            if(i = index){
                data[i] = value;
            }
            if(i > index){
                data[i - 1] = data[i];
            }
        }
    }
}

void IntVector::erase(unsigned index){
    if(index > sz || cap == 0){
        exit(1);
    }
    else{
        for(unsigned int i = 0; i <= sz; i++){
            if(i = index){
                data[i] = data[i + 1];
            }
        }
        sz -= 1;
    }
}

void IntVector::push_back(int value){
    sz += 1;
    if(sz > cap){
        expand();
    }
    data[sz] = value;
}

void IntVector::pop_back(){
    if(sz < 0 || cap <= 0){
        exit(1);
    }
    sz -= 1;
}

void IntVector::clear(){
    sz = 0;
}

void IntVector::resize(unsigned size, int value){
    if(size < sz){
        sz = size;
    }
    else if(size > sz){
        int a = size - sz;
        for (unsigned int i = a; i < size; i++){
            data[i] = value;
        }
    }
    if(sz > cap){
        int b = cap * 2;
        int c = sz - cap;
        if(b > c){
            expand();
        }
        else{
            expand(c);
        }
    }
}

void IntVector::reserve(unsigned n){
    int a = cap * 2;
    int b = n - cap;
    if(a > b){
        expand(a);
    }
    else{
        expand(b);
    }
}

void IntVector::assign(unsigned n, int value){
    sz = n;
    if(sz > cap){
        int a = cap * 2;
        int b = n - cap;
        if(a > b){
            expand(a);
        }
        else{
            expand(b);
        }
    }
    data = new int[sz];
    *data = value;
}

int & IntVector::at(unsigned index){
    if(index >= sz){
        exit(1);
    }
    return data[index];
}

int & IntVector::front(){
    return data[0];
}

int & IntVector::back(){
    return data[sz - 1];
}
void IntVector::expand() 
{
    expand(cap * 2);
}
void IntVector::expand(unsigned amount)
{
   if (cap == 0 || sz == 0 || amount == 0)
     return;
   cap += amount;
   int *data2 = new int[cap];
   std::copy(data, data + sz, data2);
   delete[] data;
   data = data2;
IntVector::IntVector(unsigned size)
{
    sz = size;
    cap = size;
    data = new int[sz];
    *data = 0;   // what if size is 0?
}