c++笔记:动态内存管理

内存主要有四块,栈,堆,全局和静态,常量。

栈,堆和java一样,开发主要是集中在堆里,能过new,malloc来操作,其它内存都是系统申请释放的。

关于常量如果用指针修改会报段错误:

	char* charP1 = "test const";
	*(charP1+1) = 'c';
	cout << charP1 << endl;

 

堆操作:

#include <iostream>
#include<stdlib.h>

using namespace std;

void test(string &str);
void test(char* charP);
void getPos();

int main() {
	// stack
	string str = "abcdefghijk";
	test(str);
	// error: type 'struct std::string' argument given to 'delete', expected pointer
	// str没有用new分配的是heap空间,数据在stack中,超出作用域自动释放,手动删除会报错
	// 看错误提示,delete后需要跟指针,所以只能delete new返回的
	//delete str;
	cout << str << endl;

	// heap
	string* str1 = new string();
	*str1 = "abcdefghijk";
	test(*str1);
	cout << *str1 << " str1 address:" << (void*)str1 << endl;
	// new分配的heap空间,不删除会内存泄露
	// 删除后可以看到&pos = str1;
	delete str1;
	str1 = NULL;
	getPos();

	int mallSize = 10;
	char* str2 = (char*)malloc(mallSize * sizeof(char));
	memset(str2, 0x00, mallSize);
	strcpy(str2, "abcdef");
	test(str2);
	cout << str2 << endl;
	free(str2);
	return 0;
}
void test(string &str) {
	int size = str.size();
	cout << size << endl;
	char* charP = new char[str.size() + 1];
	memset(charP, 0x00, str.size() + 1);
	for (int i = 0; i < str.size(); i++) {
		*(charP + str.size() - i - 1) = *(str.c_str() + i);
	}
	//memcpy(charP, str.c_str(), str.size());
	//string &r = str;
	//cout << (void*) charP << endl;
	//r = charP;
	str = charP;
	delete[] charP;
	charP = NULL;
	cout << "return: " << (void*) charP << endl;
}
void test(char* charP) {
	char* tmpP = new char[strlen(charP)];
	strcpy(tmpP, charP);
	for (int i = 0; i < strlen(charP); i++) {
		*(charP + strlen(charP) - i - 1) = *(tmpP + i);
	}
	delete[] tmpP;
}

void getPos() {
	char* pos = new char[1];
	*pos = 0;
	cout << "pos address:" << (void*)pos << endl;
}

 

此条目发表在c++分类目录。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据