30/09/2018, 17:02

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

... viết 19:03 ngày 30/09/2018
#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;
}

Ideone.com

Ideone.com

Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.


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.

Never is too late! viết 19:16 ngày 30/09/2018

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 :((

Coulson viết 19:07 ngày 30/09/2018

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;

Never is too late! viết 19:17 ngày 30/09/2018

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

Công Tuyền Lê viết 19:17 ngày 30/09/2018

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ụ :))
rogp10 viết 19:18 ngày 30/09/2018

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

Công Tuyền Lê viết 19:07 ngày 30/09/2018

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 đó ạ

Nguyễn Phạm Anh Quân viết 19:09 ngày 30/09/2018

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));

rogp10 viết 19:05 ngày 30/09/2018

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.

Dương Copeo viết 19:07 ngày 30/09/2018
#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

Nguyễn Phạm Anh Quân viết 19:17 ngày 30/09/2018

@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!

rogp10 viết 19:18 ngày 30/09/2018

Đú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”.

Dương Copeo viết 19:08 ngày 30/09/2018

:)) 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?

rogp10 viết 19:15 ngày 30/09/2018

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).

Bài liên quan
0