Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
您将如何更换';新';关键词? 有一篇文章我发现很久以前(我找不到ATM),它说明了为什么C++中的新关键字是坏的。我记不清所有的原因,但我记得最清楚的两个原因是您必须将new与delete匹配,new[]与delete[]匹配,并且您不能像使用malloc一样使用#define with new 我正在设计一种语言,所以我想问一下,你将如何改变C++语言,这样新的语言就更友好了。请随时用新的和新的文章陈述问题。我希望我能找到这篇文章的链接,但我记得它很长,是由一所知名学校(IIRC)的一位教授写的。_C++_Language Design_New Operator_Keyword - Fatal编程技术网

您将如何更换';新';关键词? 有一篇文章我发现很久以前(我找不到ATM),它说明了为什么C++中的新关键字是坏的。我记不清所有的原因,但我记得最清楚的两个原因是您必须将new与delete匹配,new[]与delete[]匹配,并且您不能像使用malloc一样使用#define with new 我正在设计一种语言,所以我想问一下,你将如何改变C++语言,这样新的语言就更友好了。请随时用新的和新的文章陈述问题。我希望我能找到这篇文章的链接,但我记得它很长,是由一所知名学校(IIRC)的一位教授写的。

您将如何更换';新';关键词? 有一篇文章我发现很久以前(我找不到ATM),它说明了为什么C++中的新关键字是坏的。我记不清所有的原因,但我记得最清楚的两个原因是您必须将new与delete匹配,new[]与delete[]匹配,并且您不能像使用malloc一样使用#define with new 我正在设计一种语言,所以我想问一下,你将如何改变C++语言,这样新的语言就更友好了。请随时用新的和新的文章陈述问题。我希望我能找到这篇文章的链接,但我记得它很长,是由一所知名学校(IIRC)的一位教授写的。,c++,language-design,new-operator,keyword,C++,Language Design,New Operator,Keyword,使用垃圾收集,这样你就不需要将新内容与任何内容相匹配。我会用C#给出它的new语义(或多或少): 为对象分配内存 通过将成员变量设置为其默认值来初始化内存(值通常为0,引用通常为null) Initializes对象的动态绑定机制(C++中的VTABLE,托管VM的DEF表类型)。 调用构造函数,此时虚拟调用按预期工作 对于没有垃圾收集的语言(此时新语言的eww),从调用中返回smart\u ptr或类似内容 另外,将所有对象设置为值类型或引用类型,这样就不必保留显式的smart\u ptr。

使用垃圾收集,这样你就不需要将新内容与任何内容相匹配。

我会用C#给出它的
new
语义(或多或少):

  • 为对象分配内存
  • 通过将成员变量设置为其默认值来初始化内存(值通常为0,引用通常为
    null
  • Initializes对象的动态绑定机制(C++中的VTABLE,托管VM的DEF表类型)。
  • 调用构造函数,此时虚拟调用按预期工作
  • 对于没有垃圾收集的语言(此时新语言的eww),从调用中返回
    smart\u ptr
    或类似内容

  • 另外,将所有对象设置为值类型或引用类型,这样就不必保留显式的
    smart\u ptr
    。只允许
    new
    为引用类型进行堆分配,并确保它包含正确调用析构函数的信息。对于值类型,<代码> NeX/COD>从堆栈调用内存中的构造函数。

    < P>我不能看到任何理由用其他东西替换<代码>新< /Cord>关键字(似乎是C++委员会同意我)。这是清楚的,并且说明了它应该做什么。您可以在类中重写
    运算符new
    ,无需使用defines

    要消除
    new[]
    /
    delete[]
    问题,可以使用
    std::vector


    如果您想使用智能指针,您可以使用它,但我想控制何时使用智能指针。这就是为什么我喜欢它在C++高级行为中的作用,它有能力控制低层次的细节。

    < P>使用STL容器类和各种BooS:StaskPtRs,在C++代码中很少需要显式地调用新的或删除。p> 您可能需要调用new的少数地方(例如,初始化智能指针)使用命名构造函数习惯用法返回封装在中的类类型指针,例如,
    boost:shared\u ptr

    <>但是C++和STL非常难让你把大多数对象当作值对象,所以你可以构造对象而不是指针,只使用它们。

    给出了所有这些,就不需要替换新的操作符,这样做会带来很多问题,不管是需要垃圾回收器,还是通过降低精细的C++控制提供程序员。< /P>问题匹配新的、删除的、新的[]、删除[] 没什么大不了的。
    您应该在类中包装内存分配,这样就不会真正影响普通用户。单个obejct可以用智能指针包装。而数组可以用std::Vector表示

    不能像使用malloc一样使用#define with new。
    像这样搞乱malloc的原因是在应用程序和标准内存管理层之间引入了自己的内存管理层。这是因为在C语言中,不允许您编写自己的malloc版本。在C++中,编写新版本的新版本是非常合法的,这使得这个技巧不必要。

    < P>如果你的<强> < <强>语言是垃圾收集的,你可以避免<强>新<强>关键字。Python就是这么做的(Lisp在近50年前也是这么做的!)。另请参见Peter Norvig提供的关于类似问题的答案。(没有“新闻”是好消息吗?

    有时您希望用工厂替换构造函数。这是一个众所周知的重构。那么这也许就是这篇文章的意思

    顺便说一句,你经常会看到直接呼叫新的被替换为新的

    DI框架,例如,将这个概念提升到另一个层次。正如您在下面的C#代码中所看到的,没有应用“new”来创建IMyClass接口:

    IUnityContainer myContainer = new UnityContainer();
    myContainer.RegisterType<IMyClass, SomeClass>();
    IMyClass thing = myContainer.Resolve<IMyClass>();
    
    IUnityContainer myContainer=newunitycontainer();
    myContainer.RegisterType();
    IMyClass thing=myContainer.Resolve();
    

    C++有单独的<代码>新< /代码>运算符(或C <代码> MALLC/<代码>)的原因主要是可以创建对象,其对象的生命周期超过创建它们的函数的范围。p>


    如果您有尾部调用消除和continuations,您就不会在意了——对象都可以在堆栈上创建,并且具有无限的范围——对象可以存在,直到您调用与超出范围并被破坏的对象对应的continuation。然后,您可能需要对堆栈进行垃圾收集或压缩,以使其不再充满不再需要的对象(Chicken Scheme和TinyOS 2是两个不同的示例,用于在运行时或编译时提供没有动态内存的动态内存效果;Chicken Scheme不允许RAII,TinyOS不允许真正的动态分配),虽然对于大量代码来说,这种方案与RAII没有太大区别,RAII可以选择更改对象的销毁顺序。

    malloc()
    显然也很糟糕,因为您必须将其与
    free()匹配
    我不会让#定义能力影响任何关于语法的决定——它们可能是龙……如果你不能清楚地表达自己对这一语言设计决定的利弊的看法,是什么让你认为你已经准备好改进它了?这是你想写的文章吗?或者这可能是有疑问的文章:我不知道,我喜欢那样垃圾收集,但是垃圾收集