Sự khác nhau giữa malloc và new

Hôm trước đi phỏng vấn ở VNG, bị hỏi câu này, trả lời không được. Uất ức quá về nhà phải search lại.
Chia sẻ cho anh em nào chưa biết

11 Likes
#include <iostream>
using namespace std;

int main() {
    // your code goes here
    int* n = new int[4];
    delete[] n;
    n = new int[10];
    for(int i = 0; i < 10; i++)
        cout << i << " ";
    delete[] n;
     return 0;
}


Nếu nói việc thay đổi kích thước vùng nhớ của toán tử new bằng 1 dòng duy nhất thì toán tử new đúng là không làm được thật.

2 Likes

ae nào có thể phân biệt cho mình biết giữa cấp phát động và cấp phát tĩnh được không vậy. Mình mới học tới vấn đề cấp phát động mà không hiểu cho lắm. Có search trên gg mà đọc vẫn không hiểu :((

Cấp phát tĩnh:

  • vùng nhớ tĩnh được cấp phát lúc chương trình được nạp vào bộ nhớ
  • Kích thước bộ nhớ cấp phát phải là hằng số và phải được xác định lúc biên dịch chương trình
  • Không thể chủ động giải phóng vùng nhớ. Vùng nhớ sẽ được giải phóng khi ra khỏi phạm vi (scope) sử dụng của nó

Ví dụ:

#define SIZE 100
int a[10];
//hoặc
char b[SIZE]

nếu bạn truyền giá trị của một biến ví dụ như:

int size = 20;
char c[size]

thì sẽ báo lỗi vì size là biến nên giá trị nó có thể bị thay đổi khi chạy chương trình

Cấp phát động

  • Cấp phát bộ nhớ được thực hiện trong lúc chạy chương trình
  • Kích thước vùng nhớ được cấp phát không cần phải là hằng số
  • Vùng nhớ có thể được giải phóng bất cứ lúc nào sử dụng free (nếu cấp phát calloc, malloc) hoặc delete ( nếu dùng new để cấp phát)

Ví dụ:

...
int size = 0;

// lay kich thuoc bo nho can cap phat dong
cout  << "Nhap kich thuoc bo nho can cap phat: ";
cin >> size;

// lay gia tri cua bien de xac dinh kich thuoc can cap phat
int *mang = new int[size];

// Lam gi do
....
// giai phong
delete []mang;

2 Likes

Mình đã hiểu được rồi. Tks bác nhìu :blush:

Nếu cấp phát vùng nhớ cho con trỏ dạng struct:
PhanSo *p=new PhanSo;

  • Có thể dùng malloc thay cho new được không? vì sao?
  • Có cách nào để sử dụng thay cho new được không? cho ví dụ :))

Trong C++ chỉ phân biệt POD và non-POD, còn structclass là một :slight_smile:

em đang thắc mắc là có cách nào để thay thế new bằng malloc trong trường hợp trên không đó ạ

new và malloc bản chất tương tự nhau. Tuy nhiên nên dùng new vì đỡ viết thêm * sizeof(dataType), với có thể override new với error logging: https://stackoverflow.com/questions/1395202/overriding-new-and-logging-data-about-the-caller
Nhớ rằng malloc đi chung với free còn new thì phải đi chung với delete!

vd:
new: int* arr = new int[4];
malloc : int* arr = (int*)malloc(4 * sizeof(int));

1 Like

Khi xác định viết C++ thì không cần thiết phải đặt ra lựa chọn đó nữa, malloc chỉ là đặt slot mà thôi.

#include<bits/stdc++.h>
#define max 100
using namespace std;
struct nguoi
{
	string ten;
	int tuoi;
};
int main()
{
	int * a= new int [2];
	a[0]=0; a[1]=1;
	for(int i=0;i<=1;i++) cout<<a[i]<<" ";
	cout<<endl;
	int * b;
	b= (int* )realloc(a,3*sizeof(int));
	b[2]=2;
	for(int i=0;i<=2;i++) cout<<b[i]<<" ";
	
}

mình thấy new cũng có thể thay đổi bằng malloc đấy chứ.
.

Preformatted text

@Duong_Copeo bạn đi phỏng vấn kiểu này người ta cho bạn rớt, vì ko có ai mix giữa new và malloc cả! 1 cái là operator 1 cái là function thì làm sao mà mix!

1 Like

Đúng vậy, có thể nói rằng nếu cho mallocnew[] (cũng như new) như nhau thì đang thể hiện rằng là chưa “sạch nước cản”.

2 Likes

:)) cảm ơn 2 bạn nha đúng là chưa “sạch nước cản” thật, mình hiểu trộn thì vẫn chạy nhưng nếu làm thế là sai quy tắc phải không?

Sai hoàn toàn, vì new[]new tạo slot và kích hoạt một constructor với tham số được đưa vào tại chỗ; còn với malloc chỉ mở mem mà thôi, trên đó toàn là cỏ dại (vâng).

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?