Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Unified Diff: src/flags.cc

Issue 53089: Fixed test memory leaks (Closed)
Patch Set: Created 11 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/flags.cc
diff --git a/src/flags.cc b/src/flags.cc
index 31e35f06b7a88ed84bb15691e35f4eb160508b01..04817b35908b245b08c12b1d37b8a90d49bd24b8 100644
--- a/src/flags.cc
+++ b/src/flags.cc
@@ -58,6 +58,7 @@ struct Flag {
void* valptr_; // Pointer to the global flag variable.
const void* defptr_; // Pointer to the default value.
const char* cmt_; // A comment about the flags purpose.
+ bool owns_ptr_;
Søren Thygesen Gjesse 2009/03/26 10:50:09 Comment (or is it obvious)?
Christian Plesner Hansen 2009/03/27 00:24:26 Done; it wasn't obvious.
FlagType type() const { return type_; }
@@ -80,9 +81,17 @@ struct Flag {
return reinterpret_cast<double*>(valptr_);
}
- const char** string_variable() const {
+ const char* string_value() const {
ASSERT(type_ == TYPE_STRING);
- return reinterpret_cast<const char**>(valptr_);
+ return *reinterpret_cast<const char**>(valptr_);
+ }
+
+ void set_string_value(const char *value, bool owns_ptr) {
+ ASSERT(type_ == TYPE_STRING);
+ const char **ptr = reinterpret_cast<const char **>(valptr_);
+ if (owns_ptr_ && *ptr != NULL) DeleteArray(*ptr);
+ *ptr = value;
+ owns_ptr_ = owns_ptr;
}
JSArguments* args_variable() const {
@@ -125,7 +134,7 @@ struct Flag {
case TYPE_FLOAT:
return *float_variable() == float_default();
case TYPE_STRING: {
- const char* str1 = *string_variable();
+ const char* str1 = string_value();
const char* str2 = string_default();
if (str2 == NULL) return str1 == NULL;
if (str1 == NULL) return str2 == NULL;
@@ -151,7 +160,7 @@ struct Flag {
*float_variable() = float_default();
break;
case TYPE_STRING:
- *string_variable() = string_default();
+ set_string_value(string_default(), false);
break;
case TYPE_ARGS:
*args_variable() = args_default();
@@ -197,7 +206,7 @@ static SmartPointer<const char> ToString(Flag* flag) {
buffer.Add("%f", FmtElm(*flag->float_variable()));
break;
case Flag::TYPE_STRING: {
- const char* str = *flag->string_variable();
+ const char* str = flag->string_value();
buffer.Add("%s", str ? str : "NULL");
break;
}
@@ -389,17 +398,17 @@ int FlagList::SetFlagsFromCommandLine(int* argc,
*flag->float_variable() = strtod(value, &endp);
break;
case Flag::TYPE_STRING:
- *flag->string_variable() = value;
+ flag->set_string_value(value ? StrDup(value) : NULL, true);
break;
case Flag::TYPE_ARGS: {
int start_pos = (value == NULL) ? i : i - 1;
int js_argc = *argc - start_pos;
const char** js_argv = NewArray<const char*>(js_argc);
if (value != NULL) {
- js_argv[0] = value;
+ js_argv[0] = StrDup(value);
}
for (int k = i; k < *argc; k++) {
- js_argv[k - start_pos] = argv[k];
+ js_argv[k - start_pos] = StrDup(argv[k]);
}
*flag->args_variable() = JSArguments(js_argc, js_argv);
i = *argc; // Consume all arguments
@@ -491,11 +500,7 @@ int FlagList::SetFlagsFromString(const char* str, int len) {
// cleanup
DeleteArray(argv);
- // don't delete copy0 since the substrings
- // may be pointed to by FLAG variables!
- // (this is a memory leak, but it's minor since this
- // code is only used for debugging, or perhaps once
- // during initialization).
+ DeleteArray(copy0);
return result;
}

Powered by Google App Engine
This is Rietveld 408576698