ফ্রি (পিটিআর) যেখানে পিআরটি কি নল দুর্নীতিগ্রস্থ মেমোরি?


112

তাত্ত্বিকভাবে আমি এটি বলতে পারি

free(ptr);
free(ptr); 

আমরা একটি স্মৃতি দুর্নীতি যেহেতু আমরা স্মৃতি মুক্ত করছি যা ইতিমধ্যে মুক্তি পেয়েছে।

তবে কি তবে

free(ptr);
ptr=NULL;
free(ptr); 

ওএস যেহেতু একটি অপরিজ্ঞাত পদ্ধতিতে আচরণ করবে আমি কী ঘটছে সে সম্পর্কে এটির জন্য আসল তাত্ত্বিক বিশ্লেষণ পেতে পারি না। আমি যা কিছু করছি, এই স্মৃতি দুর্নীতি নাকি না?

একটি নল পয়েন্টার বিনামূল্যে কী বৈধ?


1
সি ফ্রি স্ট্যান্ডার্ড সম্পর্কে নিশ্চিত নন, তবে সি ++ এ মুছুন (এনইউএল) পুরোপুরি বৈধ, সুতরাং আমার ধারণা মুক্ত (ন্যূনুয়াল )ও হওয়া উচিত।
প্রিয়ঙ্ক বলিয়া

14
@ প্রিয়ঙ্ক: delete NULLসি ++ তে বৈধ নয়। মুছুন কনক্রিটের ধরণের নাল-পয়েন্টার মানগুলিতে প্রয়োগ করা যেতে পারে, তবে তা হয় না NULLdelete (int*) NULLআইনী, কিন্তু না delete NULL
এ্যান্ট

সুতরাং এর অর্থ যদি কোনও পয়েন্টারটি NULL ফ্রিতে ইঙ্গিত করে তবে কিছু সম্পাদন করে না es যার মানে !!!!!! আমাদের কোডিংয়ে প্রতিবার কোনও মেমরি মুক্ত করতে চাইলে কেবল একটি ফ্রি (পিটিআর) পিটিআর = এনইউএল দিয়ে প্রতিস্থাপন করতে পারেন?
বিজয়

3
না। যদি ptrমেমরিটির দিকে নির্দেশ করে এবং আপনি freeএটিতে কল না করেন, তবে স্মৃতিটি ফাঁস হবে। এটিকে সেট করা NULLমেমরির উপর আপনার হ্যান্ডেলটি হারাবে এবং ফুটো হয়ে যায়। যদি ptr ঘটে থাকে তবেNULL কল freeকরা একটি অপারেশন।
GManNickG

1
@ বেঞ্জামিন: হাহ? কোন উপসংহারে যে আপনি প্রতিস্থাপন করতে পারেন আপনার তৈরি free(ptr)সঙ্গে ptr = NULL। কেউ এরকম কিছু বলেনি।
এন্ট

উত্তর:


224

7.20.3.2 freeফাংশন

সংক্ষিপ্তসার

#include <stdlib.h> 
void free(void *ptr); 

বিবরণ

freeফাংশন স্থান দ্বারা নির্দিষ্ট কারণ ptrdeallocated হবে, যে, আরও বরাদ্দ জন্য উপলব্ধ করা। যদি ptrনাল পয়েন্টার হয় তবে কোনও ক্রিয়া ঘটে না।

দেখুন আইএসও-আইইসি 9899

বলা হচ্ছে, বন্য অঞ্চলে বিভিন্ন কোডবাসগুলি দেখার সময়, আপনি কখনও কখনও লোকদের করণীয় লক্ষ্য করবেন:

if (ptr)
  free(ptr);

এটি কারণ NULLপয়েন্টারটি মুক্ত করার সময় কিছু সি রানটাইম (আমি অবশ্যই মনে করি এটি পামোমসের ক্ষেত্রে ছিল) ক্র্যাশ হবে ।

তবে আজকাল, আমি বিশ্বাস করি যে এটি free(NULL)মানা নিরাপদ মান দ্বারা নির্দেশিত অনুসারে একটি নিষ্ক্রিয়।


29
না, পিটিআর = এনইউএল কোনওভাবেই ফ্রি (পিটিআর) এর প্রতিস্থাপন নয়, উভয়ই সম্পূর্ণ আলাদা
প্রসূন সৌরভ

7
না, এর অর্থ free(ptr)যেখানে ptrনাল রয়েছে তার কোনও পার্শ্ব প্রতিক্রিয়া নেই। কিন্তু যাই হোক, যে মেমরি ব্যবহার করে বরাদ্দ malloc()বা calloc()ব্যবহার পরে প্রকাশ করা উচিত নয়free()
গ্রেগরী Pakosz

4
পিটিআর = এনএলএল নিশ্চিত করে যে আপনি দুর্ঘটনাক্রমে ফ্রি (পিটিআর) কল করলেও আপনার প্রোগ্রামটি সেগফোল্ট হবে না।
প্রসূন সৌরভ

2
অনুগ্রহ করে নোট করুন যে যদিও সি স্ট্যান্ডার্ড এটি কোনও অপ-অপশন বলেছে, তার অর্থ এই নয় যে প্রতিটি সি-লাইব্রেরি এটির মতো পরিচালনা করে। আমি ফ্রি (এনইউএল) জন্য ক্র্যাশ দেখেছি, তাই ফ্রিটিকে প্রথমে কল করা এড়ানো ভাল।
ডেরিক

6
@ ওয়েয়ার ওল্ফবয়ের অর্থ তিনি কল free(NULL)করার NULLআগে পয়েন্টারটি পরীক্ষা করে এড়াতে চানfree()
গ্রেগরি পাকোসজ

22

সি লাইব্রেরির সমস্ত মান সম্মত সংস্করণগুলি ফ্রি (এনইউএল) কে নো-অফ হিসাবে বিবেচনা করে।

এটি বলেছিল যে, একসময় ফ্রি (এনইউএল) উপর ক্র্যাশ হওয়ার কিছু ফ্রি সংস্করণ ছিল যার কারণে আপনি কিছু প্রতিরক্ষামূলক প্রোগ্রামিং কৌশলগুলির প্রস্তাব দেখতে পাচ্ছেন:

if (ptr != NULL)
    free(ptr);

8
-1 [উদ্ধৃতি প্রয়োজন] প্রত্নতাত্ত্বিক শ্রবণ বাস্তবায়নের কিছু তত্ত্বের কারণে কোড-স্টাইল পরিবর্তন করা একটি খারাপ ধারণা।
টমাস

41
@ টমাস - আমি কখনও স্টাইল পরিবর্তন করার প্রস্তাব দিইনি, আমি কেবল ব্যাখ্যা করেছি যে আপনি এখনও কিছু স্টাইলে এই প্রস্তাবটি দেখতে পাচ্ছেন কেন।
আর স্যামুয়েল ক্লাটচো

5
@ টমাস 3 বিএসডি ( ওয়াইনহ্যাক.আর। / পাইপারমেল / ওয়াইন- পেচস / ২০০6- অক্টোবর/ 031544 এইচটিএমএল ) এবং দু'জনের জন্য পামোস (উভয়ের পক্ষে দ্বিতীয় হাত)।
ডগলাস লিডার

7
@ টমাস: সমস্যাটি ভার্সন Un ইউনিক্সের মতো বিষয় ছিল। আমি যখন শিখছিলাম, ফ্রি (xyz) যেখানে xyz == NULL ছিল এমন যে মেশিনটি শিখেছি সেখানে তাত্ক্ষণিক বিপর্যয়ের একটি রেসিপি ছিল (আইসিএল পার্ক পিএনএক্স চালিয়ে যা কিছু সিস্টেম III এক্সট্রা সহ সংস্করণ 7 ইউনিক্সের উপর ভিত্তি করে)। তবে আমি দীর্ঘদিন ধরে সেভাবে কোড করি নি।
জোনাথন লেফলার

2
নেটওয়্যারটিও ফ্রি-
এনজিএল

13

যদি পিটিআরটি নুল হয় তবে কোনও অপারেশন করা হয় না।

ডকুমেন্টেশন বলে।


তুমি কি বলতে চাও যে মুক্ত কিছুই কিছু করবে না?
বিজয়

2
বেঞ্জামিন, ঠিক এর অর্থ এটি। আপনি যদি আর্গুমেন্টের শালীনতা সম্পর্কে সচেতন হন তবে এটি সম্পাদন করার কী প্রত্যাশা করবেন?
মাইকেল ক্রেলিন - হ্যাকার

12

আমার মনে আছে পামমোসে যেখানে free(NULL)ক্র্যাশ হয়েছে সেখানে কাজ করছি ।


4
আকর্ষণীয় - এটি ক্র্যাশ করে এমন একটি দ্বিতীয় প্ল্যাটফর্ম তৈরি করে (3BSD এর পরে)।
ডগলাস লিডার

2
যদি আমি সঠিকভাবে মনে রাখি তবে পামে সি স্ট্যান্ডার্ড লাইব্রেরির উপস্থিতি ছিল না। পরিবর্তে, বেশিরভাগ অসমর্থিত শিরোলেখ ফাইলটি ছিল যা পাম ওএস এসডিকে কল করে স্ট্যান্ডার্ড লাইব্রেরি কল করে। প্রচুর জিনিস অপ্রত্যাশিতভাবে অভিনয় করেছে। এ ক্র্যাশিং NULLমান গ্রন্থাগার তুলনায় পাম টুলবক্স বড় চলমান পার্থক্য একজন।
স্টিভেন ফিশার

8
free(ptr);
ptr=NULL;
free(ptr);/*This is perfectly safe */

আপনি নিরাপদে কোনও নুল পয়েন্টার মুছতে পারেন। সেক্ষেত্রে কোনও অপারেশন করা হবে না other অন্য কথায় ফ্রি () কোনও NULL পয়েন্টারে কিছুই করে না।


8

পুনরায় সংযুক্ত ব্যবহার:

free(ptr);
ptr = NULL;

দেখা:

man free

     The free() function deallocates the memory allocation pointed to by ptr.
     If ptr is a NULL pointer, no operation is performed.

আপনি যখন আবার কল করতে পারেন NULLতারপরে free()আপনি পয়েন্টারটি সেট করেন free()এবং কোনও অপারেশন করা হবে না।


3
এটি কোনও ডিবাগার দিয়ে সেগফাল্টগুলি স্পট করতে সহায়তা করে। এটা স্পষ্ট যে p- 0 do () এর সাথে p = 0 এ সেগফল্ট হ'ল একজন মুক্ত পয়েন্টার ব্যবহার করছেন। আপনি ডিবাগারে p = 0xbfade12 দেখলে কম স্পষ্ট হয় :)
নিউরো

6

free(NULL)সি পুরোপুরি আইনি সেইসাথে হয় delete (void *)0এবং delete[] (void *)0++, হয় সি আইনগত।

বিটিডাব্লু, মেমরি দু'বার নিবিড় করে ফেলা সাধারণত এক ধরণের রানটাইম ত্রুটির কারণ হয়ে দাঁড়ায়, তাই এটি কোনওরকম দূষিত হয় না।


2
delete 0সি ++ তে আইনী নয়। deleteস্পষ্টতই পয়েন্টার ধরণের একটি অভিব্যক্তি প্রয়োজন। deleteকোনও টাইপ করা নাল-পয়েন্টার মানের ক্ষেত্রে প্রয়োগ করা আইনী , তবে 0(এবং না NULL) না ।
এএনটি

1
আপনি যে কোনওটি মুছে ফেলতে পারবেন না void*: P এটি কোন চালককে চালানো উচিত?
GManNickG

1
@ জিএমান: আপনি যতক্ষণ না এটি নাল পয়েন্টার হিসাবে মুছে ফেলতে পারেনvoid *
এন্ট

যথেষ্ট ঠিক পরিষ্কার. আমি ভুলে গেছি আমরা কেবল বিশেষভাবে নালার সাথে ডিল করছি।
GManNickG

সাধারণত কোনও কিছু কলুষিত করে না, তবে এর গ্যারান্টি নেই। এএসএলআর এটি বরং অসম্ভবকে অসম্ভব করে তোলে, তবে এখনও অসম্ভব নয়: buf1=malloc(X); free(buf1);buf2=malloc(X);free(buf1); - এখানে আপনি যদি দুর্ভাগ্য হন তবে বুফ 2 বুফ 1 এর মতো ঠিক ঠিকানা পেয়েছে, এবং আপনি ঘটনাক্রমে বুফ 1 কে দু'বার মুক্তি দিয়েছেন, তাই বুফ 1 এর দ্বিতীয় মুক্তিতে আপনি আসলে বুফ 2 কে নিঃশব্দে মুক্তি দিয়েছিলেন, কোন মূল্য ছাড়াই যে কোনও (অচল) ত্রুটি / ক্র্যাশ / যাই হোক না কেন। (তবে আপনি পরবর্তী সময়ে বুফ 2 ব্যবহার করার চেষ্টা করার পরে আপনি সম্ভবত একটি ক্র্যাশ পেয়ে যাবেন - এবং আপনি
ASLR এ

3

free(ptr)সি তে সেভ ptrহয় NULL, তবে, বেশিরভাগ লোকেরা যা জানেন না সেটি হ'ল NULL0 এর সমান হওয়া উচিত নয় I আপনি যদি এই পোর্টটি অ্যাক্সেস করতে সি তে কোনও প্রোগ্রাম লিখে থাকেন তবে আপনার পয়েন্টার প্রয়োজন হবে যার মান 0 হবে The সংশ্লিষ্ট সি লাইব্রেরির 0 এবং NULLতার মধ্যে পার্থক্য করতে হবে ।

আন্তরিক শুভেচ্ছা.


মজার ঘটনা, আমাকে অবাক করে দিয়েছিল। আমাকে NUL পয়েন্টার প্রশ্ন / উত্তরগুলির আশেপাশে ভ্রমণ করতে বাধ্য করেছে।
আর্থারপড


-3

পিটিআর কিছু স্মৃতি অবস্থানের দিকে ইঙ্গিত করছে, আসুন 0x100 বলুন।

আপনি যখন (পিটিআর) মুক্ত করেন, মূলত আপনি 0x100 কে মেমরি ম্যানেজার দ্বারা অন্যান্য ক্রিয়াকলাপ বা প্রক্রিয়াটির জন্য ব্যবহার করার মঞ্জুরি দিচ্ছেন এবং সহজ কথায় এটি সম্পদের অপসারণ is

আপনি যখন পিটিআর = এনএলএল করেন, আপনি নতুন অবস্থানের দিকে পিটিআর পয়েন্ট করছেন (নুল কী কী তা নিয়ে চিন্তা করবেন না)। এটি করার ফলে আপনি 0x100 মেমরির ডেটা ট্র্যাক করেছেন। এটি মেমরি ফুটো।

সুতরাং কোনও বৈধ পিটিআরতে পিটিআর = এনএলএল ব্যবহার করা ভাল নয়।

পরিবর্তে আপনি ব্যবহার করে কিছু নিরাপদ চেক করতে পারেন:

if (ptr! = NULL) {ফ্রি (পিটিআর);

যখন আপনি ফ্রি (পিটিআর) করেন যেখানে পিটিআর ইতিমধ্যে NULL এর দিকে ইঙ্গিত করছে, এটি কোনও অপারেশন করে না o সুতরাং এটি করা নিরাপদ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.