为阵列重新分配内存
Reallocating memory for an array?
void IntVector::expand(){
int cap2 = cap * 2;
int* data2 = new int[cap2];
for (unsigned int i = 0; i < sz; i++){
data2[i] = data[i];
}
delete[] data;
data = data2;
cap = cap2;
}
扩展使矢量的容量加倍,是为动态分配的数组重新分配内存并更新容量值。
但是,由于我类的测试工具继续崩溃并指出存在未定义的行为,因此我在这个函数上遇到了持续的问题。
编辑:
void IntVector::expand(){
if(cap == 0 || sz == 0){
exit(1);
}
int cap2 = cap * 2;
int* data2 = new int[cap2];
for (unsigned int i = 0; i < sz; i++){
data2[i] = data[i];
}
delete[] data;
data = data2;
cap = cap2;
}
void IntVector::expand(unsigned amount){
if(cap == 0 || sz == 0){
exit(1);
}
cap += amount;
int *data2 = new int[cap];
//copy(data, data+sz, data2);
for (unsigned int i = 0; i < sz; i++){
data2[i] = data[i];
}
delete[] data;
data = data2;
}
我对这两个功能仍然有很多问题。 类的测试工具不断崩溃并报告未定义的行为。 我应该只发布其余代码吗?
编辑 2:
void IntVector::expand(){
if(cap == 0){
exit(1);
}
int cap2 = cap * 2;
int* data2 = new int[cap2];
for (unsigned int i = 0; i < sz; i++){
data2[i] = data[i];
}
if(data != NULL){
delete[] data;
}
data = data2;
cap = cap2;
}
编辑:
页眉
#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];
}
首先,你实际上有重复的expand()函数。 您应该只从不提供参数的函数调用 1 参数展开函数。
void IntVector::expand()
{
expand(cap * 2);
}
现在你处理一个参数的 expand( ) 函数。
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;
}
这段代码本质上没有任何问题(请注意,我刚刚返回,而不是调用 exit(1))。 此外,还会检查金额以确保您确实需要更改容量。
因此,您需要发布您的测试工具以及您班级的其他成员。 我们不知道您如何使用此类。
现在到这个:
IntVector::IntVector(unsigned size)
{
sz = size;
cap = size;
data = new int[sz];
*data = 0; // what if size is 0?
}
如果传递的大小为 0,则该代码将失败。 是的,从技术上讲,您可以分配大小为 0 的数组,但不能像在该行中那样取消引用该内存。 您应该检查大小是否为 0。
(来自评论)
读*data = *data2
的每一行都应该读data = data2
。将星号放在前面会取消引用指针;这不是你想要做的。
(对编辑问题的回答)
默认构造函数设置为 data = NULL
。当您尝试删除此指针时,将收到错误。您应该始终在delete[] data
之前检查if (data != NULL)
。
(此外,另一个构造函数具有*data = 0
。这可能不对。如果你想把整个事情归零,你可以使用memset
或ZeroMemory
......或像其他函数一样的for
循环。
相关文章:
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 在函数中分配内存时出现问题
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- constexpr new 如何分配内存?
- 在构造函数中分配内存失败是如何冒泡的
- LLVM 传递以在特定地址分配内存
- CudaMalloc 在分配内存时失败
- 为什么它在不分配内存的情况下工作正常
- 为什么在正确解除分配内存时出现内存泄漏?
- 如何通过 malloc 为队列数组分配内存?
- vector是否为std::移动的对象连续分配内存
- 删除类成员的动态分配内存的最佳方法是什么
- 唯一指针是否在堆或堆栈上分配内存?
- 如果不分配内存,我如何能够为变量创建和分配值?
- std::initializer_list 堆是否分配内存?
- 如何按顺序或在指定的地址分配内存?
- 是否可以使用 malloc 为类对象分配内存?
- 迭代器是否分配内存(如指针)?