lim*_*imp 0 memory-management d
我在D中编写一个trie,我希望每个trie对象都有一个指向某些数据的指针,如果该节点是trie中的终端节点,则该指针具有非NULL值,否则为NULL.在创建trie之前,数据的类型是不确定的(在C中,这将使用a完成void *,但我计划用模板完成),这是为什么需要指向堆对象的原因之一.
这需要我最终在堆上创建我的数据,此时trie节点可以指向它.尝试,似乎new执行此任务,就像在C++中一样.但是由于某种原因,这会因字符串而失败.以下代码有效:
import std.stdio;
void main() {
string *a;
string b = "hello";
a = &b;
writefln("b = %s, a = %s, *a = %s", b, a, *a);
}
/* OUTPUT:
b = hello, a = 7FFF5C60D8B0, *a = hello
*/
Run Code Online (Sandbox Code Playgroud)
但是,这失败了:
import std.stdio;
void main() {
string *a;
a = new string();
writefln("a = %s, *a = %s", a, *a);
}
/* COMPILER FAILS WITH:
test.d(5): Error: new can only create structs, dynamic arrays or class objects, not string's
*/
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?如何在堆上创建字符串?
PS如果有人编写D编译器正在读这个,那么"string"中的撇号是一个语法错误.
字符串总是在堆上分配.对于任何其他动态数组(只是要键入的别名)T[],这是相同的.stringimmutable(char)[]
如果只需要一个指针,有两种方法可以做到:
auto str = "some immutable(char) array";
auto ptr1 = &str; // return pointer to reference to string (immutable(char)[]*)
auto ptr2 = str.ptr; // return pointer to first element in string (char*)
Run Code Online (Sandbox Code Playgroud)
如果需要指向空字符串的指针,请使用:
auto ptr = &"";
Run Code Online (Sandbox Code Playgroud)
请记住,您无法更改字符串中任何单个字符的值(因为它们是immutable).如果你想对字符串中的字符进行操作,请使用:
auto mutableString1 = cast(char[])"Convert to mutable."; // shouldn't be used
// or
auto mutableString2 = "Convert to mutable.".dup; // T[].dup returns mutable duplicate of array
Run Code Online (Sandbox Code Playgroud)
通常你应该避免指针,除非你完全知道你在做什么.
从内存的角度来看,任何指针都需要4B(对于x64机器来说是8B)的内存,但是如果你使用指向数组的指针那么,如果指针不为null,则使用12B(数组中的+数据)内存.4B,如果来自指针和8B是从引用到数组,因为数组引用是由两个指针组成的.数组中的一对一和一对多元素.
| 归档时间: |
|
| 查看次数: |
303 次 |
| 最近记录: |