Tôi giả định rằng char* = "string"
giống với char* = new char[6]
. Tôi tin rằng những chuỗi này được tạo ra trên đống thay vì ngăn xếp. Vì vậy, tôi cần phải tiêu diệt chúng hoặc giải phóng bộ nhớ của họ khi tôi đang thực hiện bằng cách sử dụng chúng hoặc làm họ bị phá hủy bởi chính mình?Có cần phải hủy bỏ char * = "string" hay char * = new char [6] không?
Trả lời
Không. Bạn chỉ cần tự giải phóng các chuỗi khi bạn tự phân bổ bộ nhớ bằng cách sử dụng chức năng malloc
(trong C) hoặc toán tử new
(trong C++). Nếu bạn không sử dụng malloc
hoặc new
, thì char*
hoặc chuỗi sẽ được tạo trên ngăn xếp hoặc dưới dạng hằng số biên dịch.
Bạn không biết nơi lưu trữ chuỗi ký tự. Nó thậm chí có thể được bộ nhớ chỉ đọc, do đó, mã của bạn nên đọc:
const char* c = "string";
Và một mới mảng char nên xóa d giống như bất kỳ khu vực bộ nhớ được cấp phát động khác.
Chúng không giống nhau. Ví dụ đầu tiên của bạn là một chuỗi không đổi, do đó, nó chắc chắn không được cấp phát từ heap. Ví dụ thứ hai của bạn là phân bổ bộ nhớ thời gian chạy gồm 6 ký tự và xuất phát từ vùng heap. Bạn không muốn xóa ví dụ đầu tiên của mình, nhưng bạn cần phải delete []
ví dụ thứ hai của mình.
Tôi giả sử khi tôi làm
char* = "string"
điều tương tự nhưchar* = new char[6]
.
No. Điều đầu tiên tạo ra hằng số. Sửa đổi nó là hành vi không xác định. Nhưng để trả lời câu hỏi của bạn; không, bạn không phải tiêu diệt chúng. Và chỉ một ghi chú, luôn sử dụng std::string
bất cứ khi nào có thể.
mới luôn là phân bổ trong khi xác định chuỗi nội tuyến thực sự nhúng dữ liệu vào chương trình và không thể thay đổi (một số trình biên dịch cho phép điều này bằng mẹo thông minh, đừng bận tâm).
Một số trình biên dịch loại chuỗi nội tuyến để bạn không thể sửa đổi bộ đệm.
char* const sz1 = "string"; // embedded string, immutable buffer
char* sz2 = new char[10]; // allocated string, should be deleted
số Khi bạn nói:
const char* c = "Hello World!";
Bạn đang chuyển nhượng c thành một chuỗi "tồn tại trước đó" liên tục mà không phải là giống như:
char* c = new char[6];
Chỉ trong trường hợp thứ hai là bạn phân bổ bộ nhớ trên heap. Vì vậy, bạn sẽ gọi xóa khi bạn hoàn tất.
Tên của trò chơi là "chỉ tiêu diệt những gì bạn đã tạo".Dưới đây là các cặp:
malloc
/free
calloc
/free
new
/delete
new []
/delete []
Vì bạn tạo ra chuỗi thứ 2 sử dụng new []
, nhiệm vụ là để bạn phá hủy nó với delete []
. Hãy gọi delete [] string2
khi bạn hoàn tất.
Bây giờ, nếu mã của bạn đủ phức tạp và giúp việc theo dõi việc xóa khó khăn, hãy xem xét việc sử dụng con trỏ phạm vi hoặc con trỏ tự động. Lớp học boost::scoped_ptr
từ thư viện tăng cường là một nơi tốt để bắt đầu. Ngoài ra, hãy nhìn vào thành ngữ RAII, các công cụ khá tiện dụng và hữu ích.
Hãy xem những gì GCC 4.8 x86-64 Linux không
Chương trình:
#include <cstdio>
int main() {
const char *s = "abc";
char *sn = new char[4];
sn[3] = '\0';
std::printf("%s\n", s);
std::printf("%s\n", sn);
}
Compile và biên soạn lại:
g++ -ggdb -std=c++98 a.cpp
objdump -CSr a.o
Dữ liệu ra gồm:
const char *s = "abc";
8: 48 c7 45 f0 00 00 00 movq $0x0,-0x10(%rbp)
f: 00
c: R_X86_64_32S .rodata
char *sn = new char[4];
10: bf 04 00 00 00 mov $0x4,%edi
15: e8 00 00 00 00 callq 1a <main+0x1a>
16: R_X86_64_PC32 operator new[](unsigned long)-0x4
1a: 48 89 45 f8 mov %rax,-0x8(%rbp)
Giải thích:
char *s = "abc"
đi vào.rodata
. Vì vậy, bạn không thểfree
nó theo bất kỳ cách nào.char *sn = new char[4];
xuất phát từ đầu ra củaoperator new[]
. Vì vậy, bạn nên giải phóng nó khi bạn có thể.
- 1. C++ new * char không trống
- 2. char! = (Ký char), char! = (Unsigned char)
- 3. So sánh Char/String
- 4. String để char mảng Java
- 5. std :: string vs. char *
- 6. Chuyển đổi ưu tiên từ char (không phải char *) thành tiêu chuẩn :: string
- 7. C char để string (đi qua char để strcat())
- 8. Char Mảng VS Char *
- 9. Sự khác biệt giữa char a [] = "string"; char * p = "chuỗi";
- 10. const char * kiểu char *
- 11. Tại sao kết quả của unsigned char << unsigned char không phải là unsigned char
- 12. convert unsigned char * thành String
- 13. char * foo vs char * foo
- 14. C++ chuyển đổi char thành const char *
- 15. Lặp lại qua chuỗi char bằng char
- 16. Chuyển đổi char [] mảng để String
- 17. chuyển đổi không hợp lệ từ unsigned char * để char *
- 18. String.Replace (char, char) hoặc Replace (chuỗi, chuỗi)?
- 19. Có thể chuyển đổi char [] thành char * trong C?
- 20. trống static_cast * char * vs static_cast trống ** char **
- 21. Chuyển mảng char thành unsigned char *
- 22. mảng char vs con trỏ char
- 23. C Chuyển đổi char thành char *
- 24. stl map <char*,char*> destructor
- 25. const char * myVar vs const char myVar []
- 26. Phân bổ bộ nhớ char * và char []
- 27. Có phải tất cả các mảng char tự động bị hủy không?
- 28. C: Gán "static const char * const" thành "const tĩnh char *"
- 29. std.algorithm.joiner (string [], string) - tại sao các phần tử kết quả là dchar chứ không phải char?
- 30. không thể chuyển đổi từ 'string' thành 'char []' cho chia
"mới" cấp phát bộ nhớ từ heap, không bao giờ từ ngăn xếp. (Trừ khi, tất nhiên, bạn đã ghi đè toán tử mới.) –
Tệ của tôi. Tôi biết rằng. Có thật không. :-) – Andrew
Sau đó vui lòng chỉnh sửa;) – FordFulkerson