Rob Gordon的"Essential JNI:Java Native Interface"一书包含以下代码示例,用于将jstring转换为C字符串:
const char* utf_string;
jboolean isCopy;
utf_string = env->GetStringUTFChars(str, &isCopy);
/* ... use string ... */
if (isCopy == JNI_TRUE) {
env->ReleaseStringUTFChars(str, utf_string);
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是它只调用ReleaseStringUTFChars,如果isCopy是真实的.
但是Java Native Interface:Programmer's Guide and Specification(备用链接:)这本书http://192.9.162.55/docs/books/jni/html/objtypes.html#5161说:
无论GetStringChars将*isCopy设置为JNI_TRUE还是JNI_FALSE,都必须调用ReleaseString-Chars.ReleaseStringChars可以释放副本或取消实例,具体取决于GetStringChars是否返回了副本.
我认为这是戈登书中的一个错误是正确的吗?
写完后:
std::pair<int, int> x;
Run Code Online (Sandbox Code Playgroud)
我保证x.first和x.second都是零吗?或者他们可以有任何价值吗?
我之所以关心是因为我试图确定一个值为指针的映射是否保证在访问不在映射中的元素时返回NULL.即,如果我这样做:
std::map<int, void*> my_map;
std::cout << int(my_map[5]) << std::endl;
Run Code Online (Sandbox Code Playgroud)
然后我保证得到零(NULL)?或者行为未定义?
如果编译器可以证明左值不会再次使用,它是否可以进行自动左值到右值转换?这是一个澄清我的意思的例子:
void Foo(vector<int> values) { ...}
void Bar() {
vector<int> my_values {1, 2, 3};
Foo(my_values); // may the compiler pretend I used std::move here?
}
Run Code Online (Sandbox Code Playgroud)
如果将a std::move添加到注释行,则可以将矢量移动到Foo参数中,而不是复制.但是,正如所写,我没有使用std::move.
静态地证明my_values在注释行之后不会被使用,这很容易.那么编译器允许移动向量,还是需要复制它?
我正在尝试确定默认值与在各种编程接口中声明的has_foo()方法之间的关系.特别是,我试图确定在什么情况下(如果有的话)你可以"明确地设置为默认值的字段与未设置值之间的差异".
如果我明确地将字段(例如"Bar.foo")设置为其默认值(例如,零),那么Bar :: has_foo()保证为该数据结构返回true吗?(对于C++生成的代码,从快速检查看来似乎也是如此,但这并不意味着它得到保证.)如果这是真的,则可以区分显式设置的默认值和序列化之前的未设置.
如果我明确地将字段设置为其默认值(例如,零),然后序列化该对象并通过线路发送它,是否将发送该值?如果不是,那么显然任何接收此对象的代码都无法区分显式设置的默认值和未设置的值.即,在序列化之后将无法区分这两种情况 - 在两种情况下, Bar :: has_foo()都将返回false.
如果无法区分,如果我想编码一个"可为空"的可选值,那么对protobuf字段进行编码的推荐技术是什么?我想到了几个选项,但看起来都不是很好:(a)添加一个额外的布尔字段来记录字段是否设置,或者(b)使用"重复"字段,即使我在语义上想要一个可选字段 - 通过这种方式,我可以区分无值(长度为零的列表)或设置值(长度为一的列表).
是否存在C++(和/或C)的任何实现,可以保证在任何时候调用未定义的行为,它会发出错误信号?显然,这样的实现可能不如标准C++实现那么高效,但它可能是一个有用的调试/测试工具.
如果不存在这样的实现,那么是否存在任何无法实现的实际原因?或者只是没有人完成它的工作呢?
编辑:为了使这更加精确:我希望有一个编译器允许我做出断言,对于运行完成的C++程序的给定运行,该运行的任何部分都不涉及未定义的行为.
看起来用于UTF16-LE和UTF-32LE的字节顺序标记之间存在歧义.特别是,考虑一个包含以下8个字节的文件:
FF FE 00 00 00 00 00 00
Run Code Online (Sandbox Code Playgroud)
如何判断此文件是否包含:
Unicode BOMs在这里描述:http://unicode.org/faq/utf_bom.html#bom4但是没有讨论这种歧义.我错过了什么吗?
我正在定义一个ProtoBuf消息,我想要一个"可以为空"的字段 - 即,我想要区分具有值而没有值的字段.举一个具体的例子,假设我有"x"和"y"字段来记录某个对象的坐标.但在某些情况下,坐标是未知的.下面的定义将无法正常工作,因为如果x或y是不确定的,那么他们默认为零(这是一个有效的值):
message MyObject {
optional float x = 1;
optional float y = 2;
}
Run Code Online (Sandbox Code Playgroud)
一种选择是添加一个布尔字段,记录相应字段的值是否已知.即:
message MyObject {
optional bool has_x = 1; // if false, then x is unknown.
optional bool has_y = 2; // if false, then y is unknown.
optional float x = 3; // should only be set if has_x==true.
optional float y = 4; // should only be set if has_y==true.
}
Run Code Online (Sandbox Code Playgroud)
但这会增加一些额外的簿记 - 例如,当我设置x字段的值时,我必须始终记住也设置has_x.另一种选择是使用列表值,其中列表总是长度为0或长度为1:
message MyObject {
repeated float …Run Code Online (Sandbox Code Playgroud) 我想用它boost::interprocess::file_lock来确保x进程写入目录的文件在完成之前P1不会被进程读取P2.要做到这一点,我想在编写P1文件boost::interprocess::file_lock时锁定文件,然后在文件完成时将其解锁.然后P2可以跳过(并返回)任何被锁定的文件.
我遇到的问题是它似乎boost::interprocess::file_lock只允许你锁定存在的文件.但是,如果我首先创建文件,然后锁定它,那么就存在竞争条件:
P1 创建文件P2 注意到文件并开始阅读P1 锁定文件P1 写一些数据P2读取一些数据,到达终点,最后只得到部分P1输出.所以我想做的就是创建一个文件,并在创建文件后立即将其锁定.有没有办法使用boost::interprocess::file_lock?
我有一个图形数据结构,我想用协议缓冲区编码.图顶点之间存在循环连接.是否有标准/通用方法在protobuf中编码这样的结构?想到的一种方法是向每个顶点添加"id"字段,并使用这些id而不是指针.例如:
message Vertex {
required int32 id = 1;
required string label = 2;
repeated int32 outgoing_edges = 3; // values should be id's of other nodes
}
message Graph {
repeated Vertex vertices = 1;
}
Run Code Online (Sandbox Code Playgroud)
然后我可以编写包装protobuf生成的类的类,并自动将这些标识符转换为反序列化的实际指针(并返回到序列化的ID).这是最好的方法吗?如果是这样,那么有没有人知道使用/记录这种方法的现有项目?如果没有,那么您会推荐什么方法?
以下代码段在BOOST_FOREACH语句内部进入了无限循环
,我不知道为什么。据我从Boost文档中得知,在BOOST_FOREACH循环中使用“ break”应该没问题。知道这里可能出什么问题吗?
std::vector<std::wstring> sectors = getSectors();
if (!_sectorCodes.empty()) { // _sectorCodes is a std::set<std::wstring>.
bool ok = false; // did we find the sector code we wanted?
BOOST_FOREACH(Symbol sector, sectors) {
if (_sectorCodes.find(sector) != _sectorCodes.end()) {
ok = true;
break;
}
}
if (!ok) return NULL;
}
Run Code Online (Sandbox Code Playgroud)
如果我将BOOST_FOREACH循环替换为for循环(使用从sectors.begin()to 的迭代器sectors.end()),那么它就可以正常工作(没有无限循环)。
版本和其他信息:
回答mkb的问题,这是我运行时得到的结果gcc -E:
if (!_sectorCodes.empty()) {
bool ok = false;
if (boost::foreach_detail_::auto_any_t …Run Code Online (Sandbox Code Playgroud) 是否有任何官方支持的方法来获取 Python 中给定 ProtoBuf 消息的父消息?Python protobuf 接口的设计方式可以保证每条消息最多有一个父消息。如果能够在不构建外部索引的情况下从消息导航到其父级消息,那就太好了。
显然,这些信息是存在的,我可以使用以下代码来获取指向任何给定消息的父级的弱指针:
>>> my_parent = my_message._listener._parent_message_weakref
Run Code Online (Sandbox Code Playgroud)
然而,这使用内部属性——如果可能的话,我宁愿使用官方支持的方法。
如果没有官方支持的方法来执行此操作,那么我需要决定是构建外部子→父索引(这可能会损害性能),还是使用这种“hackish”方法(适当包装)。
c++ ×5
boost ×2
c ×1
c++03 ×1
c++11 ×1
file-locking ×1
file-type ×1
interprocess ×1
java ×1
optimization ×1
python ×1
rvalue ×1
unicode ×1
utf-16 ×1