Có cách nào (trong C thuần khiết) để phân biệt một chuỗi được biên dịch malloc
từ một chuỗi ký tự, mà không biết đó là chuỗi nào không? Nói một cách nghiêm túc, tôi đang cố gắng tìm cách kiểm tra một biến dù đó là một chuỗi ký tự hay không và nếu có, tôi sẽ giải phóng nó; nếu không, tôi sẽ để nó đi.Làm thế nào để phân biệt một chuỗi được ghép từ một chuỗi chữ?
Tất nhiên, tôi có thể khai thác mã ngược và chắc chắn rằng nếu biến là malloc
ed hay không, nhưng chỉ trong trường hợp nếu một cách dễ dàng tồn tại ...
chỉnh sửa: dòng thêm vào làm cho câu hỏi nữa riêng.
char *s1 = "1234567890"; // string literal
char *s2 = strdup("1234567890"); // malloced string
char *s3;
...
if (someVar > someVal) {
s3 = s1;
} else {
s3 = s2;
}
// ...
// after many, many lines of code an algorithmic branches...
// now I lost track of s3: is it assigned to s1 or s2?
// if it was assigned to s2, it needs to be freed;
// if not, freeing a string literal will pop an error
Không theo bất kỳ cách di động nào, không. Tại sao bạn cần phải anyway? Có vẻ như bạn đang cố gắng quản lý bộ nhớ một cách sai lầm. Có những cách tốt hơn để đảm bảo rằng bộ nhớ được phân bổ và làm sạch đúng cách. Bước đầu tiên là không "quên" cách phân bổ cái gì đó. –
Tôi không phải là lập trình viên C/C++, nhưng điều này có vẻ khá rõ ràng vì vậy có lẽ tôi đang thiếu thứ gì đó. Dù sao, nếu bạn cần giải phóng 's2', bạn có quan tâm đến' s3' nếu nó được gán giá trị 's1' hoặc' s2', và không có gì khác? Bạn sẽ không giải phóng chuỗi được trả về bởi 'strdup' hai lần, vì vậy nếu bạn định giải phóng' s2', tại sao bạn lại quan tâm đến 's3'? –
Khi bạn viết mã trong C bạn làm như vậy trong khi đảm bảo mạnh mẽ về "ai" sở hữu bộ nhớ. Người gọi có sở hữu nó không? Sau đó, đó là trách nhiệm của họ để deallocate nó. Callee có sở hữu nó không? Điều tương tự. Bạn viết mã rất rõ ràng về chuỗi quyền sở hữu và quyền sở hữu và bạn không gặp phải các vấn đề như "ai đã giải quyết vấn đề này?" Và, như Lasse nói, nếu bạn gọi 'free' trên' s2' * và * 's3' bạn kết thúc với hành vi không xác định. –