动态内存分配 - C ++

时间:2015-04-21 01:46:26

标签: c++ memory dynamic-arrays dynamic-allocation

我正在自学C ++,目前正在学习动态分配内存。这是我目前正在使用的代码:

#include <iostream>

using namespace std;

int *memAdd(int* dyn_Point, int *lenPoint){
   int *new_Dyn_Point = new int[*lenPoint * 2];
   *lenPoint = *lenPoint * 2;
   for(int i = 0; i < *lenPoint; i++){
       new_Dyn_Point[i] = dyn_Point[i];
   }

   delete lenPoint;
   delete[] dyn_Point;
   return new_Dyn_Point;

}

int main(){

   int len = 2;
   int *lenPoint = &len;
   int current = 0;
   int val;
   int *dyn_Point = new int[len];


   cout << "Input a value for point 1: ";
   cin >> val;
   dyn_Point[current] = val;


   while(val > 0){
      current++;

      cout << "Input a value for point " << current+1 <<" (0 to exit): ";
      cin >> val;

      if(current+1 == len){
         *dyn_Point = *memAdd(dyn_Point, lenPoint);
         cout << len;
      }

      dyn_Point[current] = val;


   }

   for(int i = 0; i < len; i++){
     cout << &dyn_Point[i] << "\n";
     cout << dyn_Point[i] << "\n\n";

 }
 delete[] dyn_Point;

}

我的问题:当添加更多内存时,它必须增加一定值吗?

每当我开始使用我的&#34; len&#34;变量不是2我的程序会在我尝试分配更多内存或分配更多内存后立即崩溃,并且必须再次添加更多内存。

它应该是这样的,还是我在这里完全错过了什么?

2 个答案:

答案 0 :(得分:0)

您的while循环需要break

while() {

    //do your steps
    break;
}

在功能memAdd中需要进行以下更改:

// *lenPoint = *lenPoint * 2; 

//需要对上面的行进行评论,否则会导致过流:

    for(int i = 0; i < (*lenPoint-1); i++){

// for循环已更正以解决溢出

由于您没有分配内存,因此不需要删除 使用此变量

// delete lenPoint;

对于你的问题:当添加更多内存时,它必须增加一定值吗?

在这方面没有硬性和硬性的快速规则。的std ::矢量&lt;&GT;每当需要更多内存时,它的大小(内存分配)加倍。它与您的方法略有不同。在达到分配的上限之前,你的内存会翻倍。

**Edit**

编译完整代码作为OP请求

#include <iostream>

using namespace std;

int *memAdd(int* dyn_Point, int *lenPoint){
   int *new_Dyn_Point = new int[*lenPoint * 2];
  // *lenPoint = *lenPoint * 2;
   for(int i = 0; i < (*lenPoint-1); i++){
       new_Dyn_Point[i] = dyn_Point[i];
   }

   //delete lenPoint;
   delete[] dyn_Point;
   return new_Dyn_Point;

}

int main(){

   int len = 2;
   int *lenPoint = &len;
   int current = 0;
   int val;
   int *dyn_Point = new int[len];


   cout << "Input a value for point 1: ";
   cin >> val;
   dyn_Point[current] = val;


   while(val > 0){
      current++;

      cout << "Input a value for point " << current+1 <<" (0 to exit): ";
      cin >> val;

      if(current+1 == len){
         *dyn_Point = *memAdd(dyn_Point, lenPoint);
         cout << len<<"\n";
      }

      dyn_Point[current] = val;
     break;

   }

   for(int i = 0; i < len; i++){
     cout << dyn_Point[i] << "\n";
     cout << &dyn_Point[i] << "\n\n";

 }
 delete[] dyn_Point;

}

答案 1 :(得分:0)

  

&#34;我的问题:当添加更多内存时,它必须增加某个值吗?&#34;

当然,您必须使用这样的设计来管理内存分配。

特别是在重新分配内存以增加到必要数量时,你应该遵守Rule of Three (Five)并复制所有现有元素。


比自己做的更好的选择(可能容易出错),就是使用

std::vector<int> dyn_point;

和/或同类课程。

内存管理由container implementations处理,您不需要为此烦恼。