c++可以实现使用new分配内存后,再增加内存吗?
巴扎黑
巴扎黑 2017-04-17 13:50:02
0
4
571
#include <iostream>
#include <cstring>
#include <string>

using namespace std;

int main()
{

    char* arr = new char('A');
    cout << *arr << endl;
    return 0;
}

现在arr指向的内存空间只有一个'A',可不可以直接拓宽这个内存空间的大小,还保留这个内存空间中的数据。如果是重新使用arr = new char[10]这样的话,应该是直接改变了arr指向的内存地址吧,可不可以实现拓宽原arr指向地址的空间大小,还保留着原来的数据'A'呢?

巴扎黑
巴扎黑

全員に返信(4)
洪涛

方法有很多,列举两种:

  1. 使用 memcpy 人工移动数据:

char* arr = new char('A');
char* new_mem = new char[10];
memcpy(new_mem, arr, sizeof(*arr));
delete arr;
arr = new_mem;
... 
// 最后回收内存要用 delete [];
delete []arr;
  1. 整套不要用 new,改换成 mallocrealloc

char* arr = malloc(sizeof(char));
*arr = 'A';

char* new_mem = realloc(arr, sizeof(char[10]));
arr = new_mem;

// 最后清理内存用 free
free(arr);
いいねを押す +0
阿神

C++做法应该是使用vector来应对内存的动态需求这样:
vector<char> arr;
arr.push_back('A');

いいねを押す +0
Peter_Zhu

@casheywen 说的方法是对的,不过最好是C里面这么用,C++不会保证memcpy的操作对于对象来说是成功的,对于对象的复制最好要用拷贝构造函数来完成,因为C++里有POD数据和非POD数据之分,非POD的数据编译器会向其中插入虚表的指针,导致内存布局可能不能直接用memcpy复制来完成,换言之,即使复制了,也可能在运行时产生未定义的行为而导致程序崩溃。
POD
http://blog.csdn.net/bichenggui/article/details/4719363

此外还有memmove方法,见这里
http://www.jb51.net/article/56012.htm

有关对于非POD的操作可能要等你用C++时间比较长才能发现了,这个是运行时的不安全性,代码不一定会保证崩溃,但在某些情况下会崩溃

いいねを押す +0
Peter_Zhu

1.不可以实现拓宽原arr指向地址的空间大小。

2.新开空间,地址肯定会变。

3.至于保留原内容,复制过去就行了。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート