标签: new-operator

C++"new"运算符能否在现实生活中抛出异常?

new操作员可以在现实生活中抛出异常吗?

如果是这样,除了杀死我的应用程序之外,我是否有任何处理此类异常的选项?

更新:

任何真实的,重要的new应用程序检查失败并在没有内存时恢复吗?


也可以看看:

c++ exception out-of-memory new-operator

44
推荐指数
7
解决办法
3万
查看次数

什么时候C++需要#include <new>库?

根据运营商新的参考条目(http://www.cplusplus.com/reference/std/new/operator%20new/):

全局动态存储操作员功能在标准库中是特殊的:

  • operator new的所有三个版本都在全局命名空间中声明,而不是在std命名空间中声明.
  • 第一个和第二个版本在C++程序的每个翻译单元中隐式声明:不需要包含标题以使它们存在.

在我看来,这意味着在C++程序的每个翻译单元中都没有隐式声明第三版operator new(placement new),<new>并且需要包含标题才能使它存在.那是对的吗?

如果是这样,如何使用g ++和MS VC++ Express编译器,我似乎可以#include <new>在我的源代码中使用第三版new编译代码?

另外,关于operator new的MSDN标准C++库参考条目为包含该#include <new>语句的三种形式的operator new提供了一些示例代码,但是如果没有这个包含,该示例似乎对我来说编译和运行相同?

// new_op_new.cpp
// compile with: /EHsc
#include<new>
#include<iostream>

using namespace std;

class MyClass 
{
public: 
   MyClass( )
   {
      cout << "Construction MyClass." << this << endl;
   };

   ~MyClass( )
   {
      imember = 0; cout << "Destructing MyClass." << this << endl;
   };
   int imember;
};

int main( ) 
{
   // The first form of new …
Run Code Online (Sandbox Code Playgroud)

c++ include standard-library new-operator

44
推荐指数
3
解决办法
3万
查看次数

你可以在VB中继承带参数的子新(构造函数)吗?

在下面的代码中,我收到编译错误

Error Too many arguments to 'Public Sub New()'
Run Code Online (Sandbox Code Playgroud)

在...上Dim TestChild As ChildClass = New ChildClass("c").TestChild.Method1()即使它们都是我继承的基类,我也没有收到它.

Public Class BaseClass
    Public ReadOnly Text As String
    Public Sub New(ByVal SetText As String)
        Text = SetText
    End Sub
    Public Sub New()
        Text = ""
    End Sub
End Class

Public Class ChildClass
    Inherits BaseClass
End Class

Public Class TestClass
    Sub Test()
        Dim TestChild As ChildClass = New ChildClass("c")
        TestChild.Method1()
    End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

我可以将子类更改为:

Public Class ChildClass
    Inherits BaseClass
      Public …
Run Code Online (Sandbox Code Playgroud)

vb.net inheritance constructor new-operator

41
推荐指数
2
解决办法
4万
查看次数

在定义元类时,有没有理由选择__new__而不是__init__?

我总是设置类似这样的元类:

class SomeMetaClass(type):
    def __new__(cls, name, bases, dict):
        #do stuff here
Run Code Online (Sandbox Code Playgroud)

但我刚刚遇到了一个定义如下的元类:

class SomeMetaClass(type):
    def __init__(self, name, bases, dict):
        #do stuff here
Run Code Online (Sandbox Code Playgroud)

有什么理由比较喜欢一个吗?

更新:请记住,我正在询问有关使用__new____init__在元类中的问题.我已经理解了另一个班级中他们之间的区别.但是在元类中,我不能__new__用来实现缓存,因为__new__只在元类中创建类时调用它.

python constructor metaclass init new-operator

40
推荐指数
3
解决办法
9498
查看次数

在新行中打印,java

我有以下代码:

    System.out.println(" | 1  2  3  4  5  6  7  8  9");
    System.out.println("----------------------------");
    System.out.println("");
Run Code Online (Sandbox Code Playgroud)

我使用println创建一个新行.是否可以使用\n或\ r来做同样的事情?我试图将\n添加到第二个println语句并继续使用print方法打印但是\n不会创建新行.

有任何想法吗?

java printing new-operator println

40
推荐指数
7
解决办法
41万
查看次数

新运算符如何在JavaScript中运行?

可能是JavaScript中最不被理解的部分,站在原型链旁边.

所以问题是:怎么做......

new dataObj(args); 
Run Code Online (Sandbox Code Playgroud)

...实际创建一个对象,并定义其原型链/构造函数/等?

最好是展示一个替代方案,以完全理解这个关键字.

javascript oop object new-operator

40
推荐指数
2
解决办法
7132
查看次数

是否可以完全禁用默认的C++ new运算符?

因为我们的应用程序具有硬性能和内存限制,我们的编码标准禁止使用默认堆 - 即,不malloc,没有默认值new.每个内存分配必须选择一些特定的分配器; 就像是

// declared globally
void* operator new( size_t size, CustomAllocHeap* heap, const char* perpetrator_name )
{
  return heap->Allocate( size, perpetrator_name );
} 
// imagine a bunch of CustomAllocHeap's declared globally or statically, thus

Vector* v = new( gPhysicsHeap, __FUNCTION__ ) Vector( 1.0f, 2.0f, 3.0f, 4.0f );
// or in a class
Thingy* p = new( this->LocalArenaHeap, __FUNCTION__ ) Thingy();
Run Code Online (Sandbox Code Playgroud)

尽管我们在代码中保持了良好的规范,但是一些标准的C++组件(容器std::function)却隐蔽地调用默认new堆,这非常糟糕.

new以某种方式完全禁用默认值会很好,因此隐式导致默认分配的任何代码行都会立即引发编译器错误.这会让我们马上注意到这些事情.

我们显然可以new抛出运行时错误,

void* operator new …
Run Code Online (Sandbox Code Playgroud)

c++ new-operator

40
推荐指数
1
解决办法
2744
查看次数

Java:没有默认构造函数的类的newInstance

我正在尝试为学生的作业构建一个自动测试框架(基于jUnit,但这并不重要).他们必须为某些类创建构造函数,并为它们添加一些方法.后来,通过我提供的测试功能,他们将检查它们是否正常.

我想做的是,通过反射,创建一个我想要测试的类的新实例.问题是,有时候,没有默认的构造函数.我不关心这个,我想创建一个实例并自己初始化实例变量.有没有办法做到这一点?我很抱歉,如果之前有人问过,但我找不到任何答案.

提前致谢.

java reflection constructor instance new-operator

39
推荐指数
2
解决办法
5万
查看次数

为什么new []表达式曾经调用析构函数?

根据C ++ 17标准(此处为草案),[expr.new]:

如果new表达式创建一个对象或一个类类型的对象数组,则将对分配函数,释放函数和构造函数进行访问和歧义控制。如果new表达式创建了一个类类型的对象数组,则可能会调用析构函数。

为什么要new[]调用析构函数?毕竟是新的。它不是删除。

c++ new-operator c++17

39
推荐指数
3
解决办法
1412
查看次数

为什么非放置的`new`和`delete`内置于语言中而不仅仅是常规函数?

为什么非放置new表达式delete表达式实现为内置语言而不是常规函数?

如果我们有...

  • 一种向OS请求/回馈内存的方法

  • 一种显式调用构造函数的方法(放置new)

  • 一种显式调用析构函数的方法(~T())

...为什么不能放置new,delete只是标准库中的常规功能?例:

template <typename T, typename... Ts>
T* library_new(Ts&&... xs)
{
    auto* ptr = /* request enough memory for `T` from OS */;
    new (ptr) T(std::forward<Ts>(xs)...);
    return ptr;
}

template <typename T>
void library_delete(T* ptr)
{
    ptr->~T();
    /* reclaim memory for `T` from OS */
} 
Run Code Online (Sandbox Code Playgroud)

c++ new-operator delete-operator

38
推荐指数
2
解决办法
2897
查看次数