小编Arn*_*aud的帖子

在删除的数组上进行指针运算仍然合法吗?

今天我写了一些看起来像这样的东西:

void foo(std::vector<char>&v){
    v.push_back('a');
    char*front=&v.front();
    char*back=&v.back();
    size_t n1=back-front+1;
    v.push_back('b');//This could reallocate the vector elements
    size_t n2=back-front+1;//Is this line valid or Undefined Behavior ?
}
Run Code Online (Sandbox Code Playgroud)

如果当我按下"b"时发生重新分配,我还可以计算出我的两个指针的差异吗?

在阅读了标准的相关段落几次之后,我仍然无法在这一点上思考.

C++ 11 5.7.6:当减去指向同一数组对象元素的两个指针时,结果是两个数组元素的下标的差异.结果的类型是实现定义的有符号整数类型; 此类型应与标题(18.2)中定义为std :: ptrdiff_t的类型相同.与任何其他算术溢出一样,如果结果不适合所提供的空间,则行为未定义.换句话说,如果表达式P和Q分别指向数组对象的第i和第j个元素,则表达式(P) - (Q)具有值i-j,条件是该值适合于std :: ptrdiff_t类型的对象.此外,如果表达式P指向数组对象的元素或者指向数组对象的最后一个元素,并且表达式Q指向同一数组对象的最后一个元素,则表达式((Q)+1) - (P)具有与((Q) - (P))+ 1和 - ((P) - ((Q)+1))相同的值,并且如果表达式P指向一个,则值为零数组对象的最后一个元素,即使表达式(Q)+1没有指向数组对象的元素.除非两个指针指向同一个数组对象的元素,或者指向数组对象的最后一个元素,否则行为是未定义的.

当然我知道它有效,我只是想知道它是否合法.

c++ pointer-arithmetic undefined-behavior language-lawyer c++11

5
推荐指数
1
解决办法
480
查看次数

std :: function的异常安全性

我试图找到这个代码是否会引发异常,但没有成功:

std::function<void(void)>f=[]{};
Run Code Online (Sandbox Code Playgroud)

根据标准,std :: function的复制或移动构造函数不是noexcept.但我想缺少noexcept关键字是因为std :: function还包装了用户定义的仿函数对象,其副本或移动构造函数可以抛出.

在我的情况下,异常似乎不太可能,但它有可能吗?

c++ exception function language-lawyer c++11

4
推荐指数
1
解决办法
1111
查看次数

Visual Studio中的内存泄漏

我在Visual Studio Pro 2012上使用std :: thread使用这个简单的代码有内存泄漏:

#include <thread>

void f(){}

int main(){
    std::thread t(f);
    t.join();
    _CrtDumpMemoryLeaks();
    return 0;}
Run Code Online (Sandbox Code Playgroud)

Win32输出:

Detected memory leaks!
Dumping objects ->
{293} normal block at 0x00A89520, 44 bytes long.
 Data: <                > 01 00 00 00 00 00 00 00 00 00 00 00 0A 00 00 00 
Object dump complete.
Run Code Online (Sandbox Code Playgroud)

x64输出:

Detected memory leaks!
Dumping objects ->
{293} normal block at 0x00000000003FCB00, 72 bytes long.
 Data: <                > 01 00 00 00 00 00 00 …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading memory-leaks visual-studio c++11

4
推荐指数
1
解决办法
2693
查看次数

reinterpret_cast从对象到第一个成员

我正在看这个答案,我想知道是否使用reinterpret_cast将对象转换为第一个成员并使用结果在C++中是安全的.

假设我们有一个A类,一个B类和一个B的实例b:

class A{
public:
    int i;
    void foo(){}
};

class B{
public:
    A a;
};

B b;
Run Code Online (Sandbox Code Playgroud)

问题1:使用这样的ba是否安全:reinterpret_cast<A*>(&b)->foo()

注意:在一般情况下,我们假设类及其成员都是标准布局.

我关于reinterpret_cast的可用引用的讲座告诉我这样的用法应该被授权,因为没有别名违规,但是它与许多答案冲突,比如这个.

问题2:使用这样的ba是否安全:static_cast<A*>(static_cast<void*>(&b))->foo()

c++ type-conversion undefined-behavior reinterpret-cast c++11

4
推荐指数
1
解决办法
605
查看次数

使用Qt 5.8和SQL库配置错误

在构建Qt 5.7时,我曾经调用以下命令行:

C:\ SDK\Qt\src\configure -commercial -confirm-license -debug -and-release -force-debug-info -ltcg -static -angle -nomake examples -nomake tests -qt-sql-odbc -qt-sql -sqlite -qt-zlib -D Z_PREFIX -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtpurchasing -skip qttools -skip qtcanvas3d -skip qtconnectivity -skip qtdatavis3d -skip qtdeclarative -skip qtdoc -skip qtgamepad -skip qtgraphicaleffects -skip qtimageformats -skip qtlocation -skip qtmacextras -skip qtmultimedia -skip qtquickcontrols2 -skip qtsensors -skip qtserialport -skip qtsvg -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwinextras -skip qtx11extras -skip qtxmlpatterns -prefix C:\ SDK\Qt\x64

但是,使用Qt …

c++ qt qt5.8

4
推荐指数
1
解决办法
2959
查看次数

C++中按位运算符的定义是什么?

根据标准,operator <<为负签名的第一个操作数产生一个未定义的行为.

C++ 11 5.8.2

The value of E1 << E2 is E1 left-shifted E2 bit positions; vacated bits are zero-
filled. If E1 has an unsigned type, the value of the result is E1 × 2 pow E2,
reduced modulo one more than the maximum value representable in the result type.
Otherwise, if E1 has a signed type and non-negative value, and E1 × 2 pow E2 is
representable in the result type, then that is the resulting value; …
Run Code Online (Sandbox Code Playgroud)

c++ undefined-behavior language-lawyer

3
推荐指数
1
解决办法
1453
查看次数

从VBA调用xll UDF

我想从VBA调用我的一个用户定义函数.

我的用户定义函数在C++中声明:

XLOPER12*WINAPI HelloWorld()noexcept{
    THROWS();
    static XLOPER12 res=[](){
        static std::array<wchar_t,13>str={
            11,'H','e','l','l','o',' ','W','o','r','l','d','\0'};
        XLOPER12 tmp;
        tmp.xltype=xltypeStr;
        tmp.val.str=str.data();
        return tmp;}();
    return &res;}
Run Code Online (Sandbox Code Playgroud)

这是来自该字段的实际函数的简化版本,可以返回String或double或偶数数组.当然这里我只返回一个String,但是这限制了我的UDF的返回类型LPXLOPER12.

我可以成功注册我的函数xlfRegister指定pxTypeText"U$".然后我可以从Excel调用我的UDF:

=HelloWorld()
Run Code Online (Sandbox Code Playgroud)

它的工作原理!


如果我尝试按照此处的建议从VBA调用我的函数:

Sub macro_test()
    Dim hw As Variant
    hw = Application.Run("D:\Path\MyAddIn.xll!HelloWorld")
End Sub
Run Code Online (Sandbox Code Playgroud)

我从Application.run收到一条错误消息:

运行时错误'1004':应用程序定义的错误或对象定义的错误


如果我尝试按照此处的建议从VBA调用我的函数:

Private Declare PtrSafe Function HelloWorld Lib "C:\Path\MyAddIn.xll" () As Variant

Sub macro_test()
    Dim hw As Variant
    hw = HelloWorld()
End Sub
Run Code Online (Sandbox Code Playgroud)

我得到一个空结果而不是"Hello World".


我究竟做错了什么 ?

杂项信息: …

c++ excel vba excel-vba xll

3
推荐指数
1
解决办法
639
查看次数

可以std :: chrono :: system_clock :: now()抛出异常吗?

我想写一个非常可移植的代码,我需要std::chrono::system_clock::now()在初始化时调用.这个函数可以抛出异常吗?

在c ++ 11标准中,没有提到该问题.(至少,我没找到一个)

在Visual Studio中,源代码如下:

static time_point now() _NOEXCEPT
    {   // get current time
    return (time_point(duration(_Xtime_get_ticks())));
    }
Run Code Online (Sandbox Code Playgroud)

使用_NOEXCEPT关键字,visual studio中的答案非常明显.但一般情况呢?

c++ portability language-lawyer c++11 c++-chrono

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