new操作员可以在现实生活中抛出异常吗?
如果是这样,除了杀死我的应用程序之外,我是否有任何处理此类异常的选项?
更新:
任何真实的,重要的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) 在下面的代码中,我收到编译错误
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) 我总是设置类似这样的元类:
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__只在元类中创建类时调用它.
我有以下代码:
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不会创建新行.
有任何想法吗?
可能是JavaScript中最不被理解的部分,站在原型链旁边.
所以问题是:怎么做......
new dataObj(args);
Run Code Online (Sandbox Code Playgroud)
...实际创建一个对象,并定义其原型链/构造函数/等?
最好是展示一个替代方案,以完全理解这个关键字.
因为我们的应用程序具有硬性能和内存限制,我们的编码标准禁止使用默认堆 - 即,不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) 我正在尝试为学生的作业构建一个自动测试框架(基于jUnit,但这并不重要).他们必须为某些类创建构造函数,并为它们添加一些方法.后来,通过我提供的测试功能,他们将检查它们是否正常.
我想做的是,通过反射,创建一个我想要测试的类的新实例.问题是,有时候,没有默认的构造函数.我不关心这个,我想创建一个实例并自己初始化实例变量.有没有办法做到这一点?我很抱歉,如果之前有人问过,但我找不到任何答案.
提前致谢.
根据C ++ 17标准(此处为草案),[expr.new]:
如果new表达式创建一个对象或一个类类型的对象数组,则将对分配函数,释放函数和构造函数进行访问和歧义控制。如果new表达式创建了一个类类型的对象数组,则可能会调用析构函数。
为什么要new[]调用析构函数?毕竟是新的。它不是删除。
为什么非放置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) new-operator ×10
c++ ×5
constructor ×3
java ×2
c++17 ×1
exception ×1
include ×1
inheritance ×1
init ×1
instance ×1
javascript ×1
metaclass ×1
object ×1
oop ×1
printing ×1
println ×1
python ×1
reflection ×1
vb.net ×1