我试图编译以下代码,但编译器不会这样做,因为"*对于结构体来说是非法的"是真的吗?
struct String {
int length;
int capacity;
unsigned check;
char ptr[0];
} String;
void main(){
char *s;
String *new_string = malloc(sizeof(String) + 10 + 1);
}
Run Code Online (Sandbox Code Playgroud) 当分配一个空的时BSTR,无论是 bySysAllocString(L"")还是 bySysAllocStringLen(str, 0)你总是会得到一个新的BSTR(至少根据我所做的测试)。BSTR通常不会共享(如 Java/.NET 埋葬),因为它们是可变的,但空字符串,无论出于何种意图和目的,都是不可变的。
我的问题(最后)是为什么 COM 在创建空字符串时不使用总是返回相同字符串的简单优化BSTR(并在 中忽略它SysFreeString)?是否有令人信服的理由不这样做(因为我的推理有缺陷),或者只是因为它被认为不够重要?
我有一个这样的界面:
typedef struct Tree {
int a;
void* (*Something)(struct Tree* pTree, int size);
};
Run Code Online (Sandbox Code Playgroud)
然后据我所知,我需要创建它的实例,并使用Something方法将值设置为'size'.所以我这样做
struct Tree *iTree = malloc(sizeof(struct Tree));
iTree->Something(iTree, 128);
Run Code Online (Sandbox Code Playgroud)
但它始终无法初始化.我这样做了吗?如果Something方法的第一个成员是指向同一个结构的指针?
有人可以解释一下吗?
谢谢
我在Visual C++ 2005中遇到了一个奇怪的断言问题.我试图将断言引入我的程序中,无论我尝试使用什么断言(assert()或BOOST_ASSERT_MSG),它都会给出完全相同的错误消息,告诉我除了发生调试错误之外别无其他.
调试错误!
计划:......
此应用程序已请求Runtime以不寻常的方式终止它.请联系支持团队获取更多信息.
(按"重试"以调试应用程序)
这是我正在使用的提升断言
BOOST_ASSERT_MSG(deathRow.size() >= 3, "There are less than 3 blocks being deleted!");
Run Code Online (Sandbox Code Playgroud)
是的,它给出了完全相同的错误消息:
assert(deathRow.size() >= 3 && "There are less than 3 blocks being deleted");
Run Code Online (Sandbox Code Playgroud)
无论我正在使用什么项目,无论是新的还是旧的,都会发生不伦不类的错误.
我不知道为什么.我知道我之前在另一个程序中使用过断言并且没有这个问题.帮助将不胜感激.
以下是weak_ptr的构造函数中的两个:http: //msdn.microsoft.com/en-us/library/bb982126.aspx
weak_ptr(const weak_ptr&);
template<class Other>
weak_ptr(const weak_ptr<Other>&);
Run Code Online (Sandbox Code Playgroud)
实际代码(来自memory):
weak_ptr(const weak_ptr& _Other)
{ // construct weak_ptr object for resource pointed to by _Other
this->_Resetw(_Other);
}
template<class _Ty2>
weak_ptr(const weak_ptr<_Ty2>& _Other,
typename enable_if<is_convertible<_Ty2 *, _Ty *>::value,
void *>::type * = 0)
{ // construct weak_ptr object for resource pointed to by _Other
this->_Resetw(_Other);
}
Run Code Online (Sandbox Code Playgroud)
Q1:为什么顶级拷贝构造函数就在那里?它看起来像每个案例的底部(包括前一个).它甚至被调用了吗?如果它们没有包含它,那么底部的它会占据它的位置吗?
Q2:底层(模板化)构造函数的第二个参数发生了什么.我想我理解SFINAE方面,但我不明白为什么有一个额外的*之后::type
我看到微软的stddef.h定义nullptr_t如下:
namespace std
{
typedef decltype(__nullptr) nullptr_t;
}
using ::std::nullptr_t;
Run Code Online (Sandbox Code Playgroud)
该usingdecleration注入nullptr_t到全局命名空间.我在标准中找不到任何说明应该这样做的东西.
我也看到GCC nullptr_t不在全局命名空间中.
可以允许两种实现,还是其中一种是错误?
我的坏,GCC的行为与CL相同.
编辑:同样的情况发生cstddef,以下编译好VC(在线也).
#include <cstddef>
int main()
{
nullptr_t nil = nullptr;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用C++ unmanaged,当我调用一个返回LPVOID的方法时,我遇到了这个问题.
LPVOID MyMethod(...);
Run Code Online (Sandbox Code Playgroud)
问题是这个方法有时返回Bad Ptr,我想知道是否有一种方法可以检测到这个,如果返回的值是Bad Ptr.
我试过询问它是否为NULL而没有运气.
我知道如果结果是坏Ptr的唯一方法是在我调试时,我尝试了一些不同的方法,但仍然无法做到.
我正在尝试确定对象是否已包含在a中std::set.根据msdn(和其他来源),end()如果找不到你要求的元素,set :: find函数应该返回.
但是,当我实现如下代码时,set::find返回junk(0xbaadf00d).
set<Cell*> cellSet;
Cell* cell = new Cell();
if (cellSet.find(cell) == cellSet.end())
{
...
}
Run Code Online (Sandbox Code Playgroud)
我正确使用这个吗?我正在使用Visual C++ 2005.
在回答这个问题时,问题是关键字(自动存储)的传统C含义auto在C++ 0x中是否仍然有效,现在它意味着类型推导.
我记得,旧的含义auto应该保留在相关的地方,但其他人不同意.
auto char c = 42; // either compilation error or c = '*'
Run Code Online (Sandbox Code Playgroud)
看看编译器,我看到了当前的部门.
你知道哪个是正确的行为吗?
我想接受用户的任意正则表达式并将其锚定在两侧以强制完全匹配 ( ^<user's-regex>$) 但我不知道是否必须考虑用户可能已经锚定了他的正则表达式这一事实。
看起来 Perl、C++、.NET 和 JavaScript 都允许双倍的多重锚定。
"hello" =~ /^h/ # true
"hello" =~ /^^h/ # true
"hello" =~ /^^^h/ # true
"hello" =~ /e/ # true
"hello" =~ /^e/ # false
"hello" =~ /^^e/ # false
Run Code Online (Sandbox Code Playgroud)
有谁知道这是否指定以这种方式工作?我可以依赖这种行为吗?或者这是一个将来可能会改变的意外事件吗?
编辑:我们需要这个的原因是我们正在使用 VBScript 的正则表达式(来自 COM),match但是我们使用它会返回所有匹配项,因此匹配字符串abcto.*a.*比匹配 to慢得多^.*a.*$。通过使用@Tim建议的锚定,我们将匹配速度(对于长字符串)提高了 12 倍以上。