1. 程式人生 > >c++ 堆記憶體和棧記憶體的使用

c++ 堆記憶體和棧記憶體的使用

我是一個java程式設計師,在java幾乎沒有釋放記憶體的概念,轉到開發c++程式還有諸多不習慣,以下是我在專案的中遇到的一下問題,希望有大神能給正解

#pragma once
#include "string"
#include "iostream"

using namespace std;
class Person
{
private:
	string *name;
	string add;

public:
	Person(void);
	~Person(void);
	string* getName();
	string getAdd();
	
	void setName(string *name);

	string* getStatus();
	

};

#include "Person.h"

Person::Person(void)
{
	name = new string("xiaoming");
	add = string("zhon yang da jie");
}

Person::~Person(void)
{
	cout<<"刪除"<<endl;

	delete name;
}

string* Person::getStatus()
{
	string *sth = new string("do home work");
	cout<<"函式內:"<<sth<<endl;
	return sth;
}

string* Person::getName()
{
	return this->name;
}

std::string Person::getAdd()
{
	return this->add;
}

void Person::setName(string *name)
{if(name != NULL)delete this->name;
	this->name = name;
}

void main()
{
	Person *p = new Person();
	//(1)
	string sth = *p->getStatus();
	cout<<sth<<endl;
	cout<<&sth<<endl;
	//(2)
	string *str = p->getStatus();
	cout<<*str<<endl;
	cout<<"地址"<<str<<endl;
	delete str;
	str = p->getStatus();
	cout<<*str<<endl;
	cout<<"地址"<<str<<endl;
	//(3)
	string *name = new string("xiao wang");
	p->setName(str);
	//delete name;
	cout<<"name 地址"<<name<<endl;
	cout<<"p.name 地址"<<p->getName()<<endl;
	cout<<"p.anem 值:"<<*p->getName()<<endl;

	


	system("pause");
	delete p;
}


上述程式碼涉及到一個問題那個就是返回值的問題,第一個string sth = *p->getStatus(),p->getStatus(),返回的是一個string型別的指標此時用std來接收則是將堆記憶體的資料拷貝到棧記憶體中來,此時堆記憶體有“do home work”,這個對記憶體該如何刪除呢,於是我想到的(2)處解決方法。用一個指標接收然後刪除delete,這的確可以回收這個堆記憶體的空間。接著我發現了問題(3)這裡的問題是anme是這個指向堆記憶體的指標,它被用著引數傳遞到person中去,那這個記憶體該如何回收呢?我現在的想法是在p->setName()中先delete原來的堆記憶體,然後賦值,最後在這個類的解構函式中的delete 成員變數Name,這是我的想法如有錯誤的地方還請大家指正。

相關推薦

C++】記憶體記憶體詳解

一個由C/C++編譯的程式佔用的記憶體分為以下幾個部分  1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧  2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由OS回

c++ 記憶體記憶體的使用

我是一個java程式設計師,在java幾乎沒有釋放記憶體的概念,轉到開發c++程式還有諸多不習慣,以下是我在專案的中遇到的一下問題,希望有大神能給正解 #pragma once #include "string" #include "iostream" using nam

Java中的記憶體記憶體

Java中的堆記憶體和棧記憶體 本文主要討論作者對於Java記憶體中堆疊的理解. Oralce官方對於棧(stack)的解釋: Each Java Virtual Machine thread has a private Java Virtual Machine stack, created at

java中記憶體記憶體的分配

java中堆記憶體和棧記憶體的分配 class Person{ private String name; private int age; public Person()//無參的構造方法 { System.out.println("***

關於記憶體記憶體的簡單描述

棧記憶體:記憶體地址連續,先進來的存放在棧底,所以先進後出,由系統自動分配空間。如:user user;此時,系統已經在棧記憶體中為user分配了空間,現在處於棧頂部,後面再來的會將這個往下推,直到user被推到了最低的記憶體塊,則記憶體佔滿。棧記憶體又稱為靜態記憶體。這個

java記憶體記憶體的區別

一段時間之前,我寫了兩篇文章文章分別是Java的垃圾回收和Java的值傳遞,從那之後我收到了很多要求解釋Java堆記憶體和棧記憶體的郵件,並且要求解釋他們的異同點。在Java中你會看到很多堆和棧記憶體的引用,JavaEE書和文章很難在程式的角度完全解釋什麼是堆什麼是棧。Jav

Java中的堆疊機制以及記憶體記憶體

java中記憶體分配策略及堆和棧的比較    1 記憶體分配策略    按照編譯原理的觀點,程式執行時的記憶體分配有三種策略,分別是靜態的,棧式的,和堆式的.    靜態儲存分配是指在編譯時就能確定每個資料目標在執行時刻的儲存空間需求,因而在編譯時就可以給他們分配固定的記憶體空間.這種分配策略要求程式程式碼中

為什麼會有記憶體記憶體之分

當一個方法執行時,每個方法都會建立自己的記憶體棧,在這個方法內定義的變數將會逐個放入這塊棧記憶體裡,隨著方法的執行結束,這個方法的記憶體棧也將自然銷燬。因此,所有在方法中定義的區域性變數都是放在棧記憶

記憶體記憶體的區別(通俗版)

下面就說說C語言程式記憶體分配中的堆和棧,這裡有必要把記憶體分配也提一下,大家不要嫌我囉嗦,一般情況下程式存放在Rom(只讀記憶體,比如硬碟)或Flash中,執行時需要拷到RAM(隨機儲存器RAM)中執行,RAM會分別儲存不同的資訊,如下圖所示: 記憶體中的棧區

JVM中記憶體記憶體詳解

java中記憶體分配策略及堆和棧的比較  1 記憶體分配策略   按照編譯原理的觀點,程式執行時的記憶體分配有三種策略,分別是靜態的,棧式的,和堆式的. 靜態儲存分配是指在編譯時就能確定每個資料目標在執行時刻的儲存空間需求,因而在編譯時就可以給他們分配固定的記憶體空間.這種分配策略要求程式程式碼中不允許有可變

Java中編譯期、執行期、記憶體記憶體詳解

java中記憶體分配策略及堆和棧的比較    1 記憶體分配策略    按照編譯原理的觀點,程式執行時的記憶體分配有三種策略,分別是靜態的,棧式的,和堆式的.    靜態儲存分配是指在編譯時就能確定每個資料目標在執行時刻的儲存空間需求,因而在編譯時就可以給他們分配固定的記憶體空間.這種分配策略要求程式程式碼中

記憶體記憶體詳解

堆:順序隨意 棧:先進後出 堆和棧的區別 一、預備知識—程式的記憶體分配 一個由c/C++編譯的程式佔用的記憶體分為以下幾個部分 1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧 2、堆區(heap) —

java記憶體分為兩種,記憶體記憶體

堆記憶體用於存放由new建立的物件和陣列。在堆中分配的記憶體,由java虛擬機器自動垃圾回收器來管理。在堆中產生了一個數組或者物件後,還可以在棧中定義一個特殊的變數,這個變數的取值等於陣列或者物件在堆記憶體中的首地址,在棧中的這個特殊的變數就變成了陣列或者物件的引用變數,以後就可以在程式中使用棧記憶體中的引用

Java中記憶體記憶體詳解

java中記憶體分配策略及堆和棧的比較   1 記憶體分配策略   按照編譯原理的觀點,程式執行時的記憶體分配有三種策略,分別是靜態的,棧式的,和堆式的.   靜態儲存分配是指在編譯時就能確定每個資料目標在執行時刻的儲存空間需求,因而在編譯時就可以給他們分配固定的記憶體空間.這種分配策略要求程式程式碼中

js中記憶體記憶體事例

2013/4/2 17:28:34 js中如果建立兩個個物件p1,p2,使用p1為p2賦值會怎樣? var p1 = new Person(); p1.name = ‘zhangsan’; p1.age = 30; var p2 = p1; 這時,p1和p2會

記憶體記憶體

程式的記憶體分配 一個由C/C++編譯的程式佔用的記憶體分為以下幾個部分 棧區(stack)—— 由編譯器(作業系統)自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。 堆區(heap)(new、malloc等) —— 一

C++ 應用程式 記憶體結構 --- BSS段,資料段,程式碼段,記憶體

二. 在C++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區1.棧,就 是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。2.堆,就 是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一

C++類new、delete操作符記憶體的分配

如果你是Java、C#、PHP程式設計師,那麼會對 new 非常熟悉,在這些程式語言中,只能通過 new 來建立物件。 在C++中,你可以像定義變數一樣來建立物件,如: Studentstu; //物件已被例項化,已分配記憶體空間,可以使用了stu.say();

C#記憶體分配記憶體分配

在C#中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。 棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。 堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般一個new

JVM記憶體、方法區記憶體的關係

以下程式碼展示Java堆記憶體、方法區和Java棧記憶體之間的關係 package cn.liang.jvm; public class SimpleHeap { private int id; public SimpleHeap(int id){ this.id = id;